1 |
// example_client.c |
2 |
// |
3 |
/**************************************************************************** |
4 |
Copyright (C) 2004, rncbc aka Rui Nuno Capela. All rights reserved. |
5 |
|
6 |
This program is free software; you can redistribute it and/or |
7 |
modify it under the terms of the GNU General Public License |
8 |
as published by the Free Software Foundation; either version 2 |
9 |
of the License, or (at your option) any later version. |
10 |
|
11 |
This program is distributed in the hope that it will be useful, |
12 |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 |
GNU General Public License for more details. |
15 |
|
16 |
You should have received a copy of the GNU General Public License |
17 |
along with this program; if not, write to the Free Software |
18 |
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
19 |
|
20 |
*****************************************************************************/ |
21 |
|
22 |
#include "lscp/client.h" |
23 |
#include "lscp/device.h" |
24 |
|
25 |
#include <time.h> |
26 |
|
27 |
#define SERVER_PORT 8888 |
28 |
|
29 |
#if defined(WIN32) |
30 |
static WSADATA _wsaData; |
31 |
#endif |
32 |
|
33 |
//////////////////////////////////////////////////////////////////////// |
34 |
|
35 |
lscp_status_t client_callback ( lscp_client_t *pClient, lscp_event_t event, const char *pchBuffer, int cchBuffer, void *pvData ) |
36 |
{ |
37 |
lscp_status_t ret = LSCP_OK; |
38 |
|
39 |
char *pszBuffer = (char *) malloc(cchBuffer + 1); |
40 |
if (pszBuffer) { |
41 |
memcpy(pszBuffer, pchBuffer, cchBuffer); |
42 |
pszBuffer[cchBuffer] = (char) 0; |
43 |
printf("client_callback: event=0x%04x [%s]\n", (unsigned int) event, pszBuffer); |
44 |
free(pszBuffer); |
45 |
} |
46 |
else ret = LSCP_FAILED; |
47 |
|
48 |
return ret; |
49 |
} |
50 |
|
51 |
//////////////////////////////////////////////////////////////////////// |
52 |
|
53 |
void client_test_start ( clock_t *pclk ) { *pclk = clock(); } |
54 |
float client_test_elapsed ( clock_t *pclk ) { return (float) ((long) clock() - *pclk) / (float) CLOCKS_PER_SEC; } |
55 |
|
56 |
#define CLIENT_TEST(p, x) { clock_t c; void *v;\ |
57 |
printf(#x ":\n"); client_test_start(&c); v = (void *) (x); \ |
58 |
printf(" elapsed=%gs\n", client_test_elapsed(&c)); \ |
59 |
printf(" ret=%p (%d)\n", v, (int) v); \ |
60 |
printf(" errno=%d\n", lscp_client_get_errno(p)); \ |
61 |
printf(" result=\"%s\"\n", lscp_client_get_result(p)); } |
62 |
|
63 |
void client_test ( lscp_client_t *pClient ) |
64 |
{ |
65 |
const char **ppszAudioDrivers, **ppszMidiDrivers, **ppszEngines; |
66 |
const char *pszAudioDriver, *pszMidiDriver, *pszEngine; |
67 |
int iAudioDriver, iMidiDriver, iEngine; |
68 |
int iSamplerChannel; |
69 |
|
70 |
CLIENT_TEST(pClient, ppszAudioDrivers = lscp_get_available_audio_drivers(pClient)); |
71 |
if (ppszAudioDrivers == NULL) { |
72 |
fprintf(stderr, "client_test: No audio drivers available.\n"); |
73 |
return; |
74 |
} |
75 |
|
76 |
CLIENT_TEST(pClient, ppszMidiDrivers = lscp_get_available_midi_drivers(pClient)); |
77 |
if (ppszMidiDrivers == NULL) { |
78 |
fprintf(stderr, "client_test: No MIDI drivers available.\n"); |
79 |
return; |
80 |
} |
81 |
|
82 |
CLIENT_TEST(pClient, ppszEngines = lscp_get_available_engines(pClient)); |
83 |
if (ppszEngines == NULL) { |
84 |
fprintf(stderr, "client_test: No engines available.\n"); |
85 |
return; |
86 |
} |
87 |
|
88 |
CLIENT_TEST(pClient, lscp_get_audio_devices(pClient)); |
89 |
CLIENT_TEST(pClient, lscp_list_audio_devices(pClient)); |
90 |
|
91 |
CLIENT_TEST(pClient, lscp_get_midi_devices(pClient)); |
92 |
CLIENT_TEST(pClient, lscp_list_midi_devices(pClient)); |
93 |
|
94 |
for (iAudioDriver = 0; ppszAudioDrivers[iAudioDriver]; iAudioDriver++) { |
95 |
pszAudioDriver = ppszAudioDrivers[iAudioDriver]; |
96 |
printf("\n--- pszAudioDriver=\"%s\" ---\n", pszAudioDriver); |
97 |
CLIENT_TEST(pClient, lscp_get_audio_driver_info(pClient, pszAudioDriver)); |
98 |
for (iMidiDriver = 0; ppszMidiDrivers[iMidiDriver]; iMidiDriver++) { |
99 |
pszMidiDriver = ppszMidiDrivers[iMidiDriver]; |
100 |
printf("\n--- pszMidiDriver=\"%s\" ---\n", pszMidiDriver); |
101 |
CLIENT_TEST(pClient, lscp_get_midi_driver_info(pClient, pszMidiDriver)); |
102 |
for (iEngine = 0; ppszEngines[iEngine]; iEngine++) { |
103 |
pszEngine = ppszEngines[iEngine]; |
104 |
printf("\n--- pszEngine=\"%s\" ---\n", pszEngine); |
105 |
CLIENT_TEST(pClient, lscp_get_engine_info(pClient, pszEngine)); |
106 |
CLIENT_TEST(pClient, lscp_get_channels(pClient)); |
107 |
CLIENT_TEST(pClient, lscp_list_channels(pClient)); |
108 |
CLIENT_TEST(pClient, iSamplerChannel = lscp_add_channel(pClient)); |
109 |
printf(">>> iSamplerChannel=\"%d\"\n", iSamplerChannel); |
110 |
CLIENT_TEST(pClient, lscp_get_channel_info(pClient, iSamplerChannel)); |
111 |
CLIENT_TEST(pClient, lscp_load_engine(pClient, pszEngine, iSamplerChannel)); |
112 |
CLIENT_TEST(pClient, lscp_load_instrument(pClient, "DefaultInstrument.gig", 0, iSamplerChannel)); |
113 |
CLIENT_TEST(pClient, lscp_get_channel_voice_count(pClient, iSamplerChannel)); |
114 |
CLIENT_TEST(pClient, lscp_get_channel_stream_count(pClient, iSamplerChannel)); |
115 |
CLIENT_TEST(pClient, lscp_get_channel_buffer_fill(pClient, LSCP_USAGE_BYTES, iSamplerChannel)); |
116 |
CLIENT_TEST(pClient, lscp_get_channel_buffer_fill(pClient, LSCP_USAGE_PERCENTAGE, iSamplerChannel)); |
117 |
CLIENT_TEST(pClient, lscp_set_channel_audio_type(pClient, iSamplerChannel, pszAudioDriver)); |
118 |
CLIENT_TEST(pClient, lscp_set_channel_audio_device(pClient, iSamplerChannel, 0)); |
119 |
CLIENT_TEST(pClient, lscp_set_channel_audio_channel(pClient, iSamplerChannel, 0, 1)); |
120 |
CLIENT_TEST(pClient, lscp_set_channel_midi_type(pClient, iSamplerChannel, pszMidiDriver)); |
121 |
CLIENT_TEST(pClient, lscp_set_channel_midi_device(pClient, iSamplerChannel, 0)); |
122 |
CLIENT_TEST(pClient, lscp_set_channel_midi_channel(pClient, iSamplerChannel, 0)); |
123 |
CLIENT_TEST(pClient, lscp_set_channel_midi_port(pClient, iSamplerChannel, 0)); |
124 |
CLIENT_TEST(pClient, lscp_set_channel_volume(pClient, iSamplerChannel, 0.5)); |
125 |
CLIENT_TEST(pClient, lscp_get_channel_info(pClient, iSamplerChannel)); |
126 |
CLIENT_TEST(pClient, lscp_reset_channel(pClient, iSamplerChannel)); |
127 |
CLIENT_TEST(pClient, lscp_remove_channel(pClient, iSamplerChannel)); |
128 |
printf("\n"); |
129 |
} |
130 |
} |
131 |
} |
132 |
|
133 |
} |
134 |
|
135 |
//////////////////////////////////////////////////////////////////////// |
136 |
|
137 |
void client_usage (void) |
138 |
{ |
139 |
printf("\n %s %s (Build: %s)\n", lscp_client_package(), lscp_client_version(), lscp_client_build()); |
140 |
|
141 |
fputs("\n Available client commands: help, test, exit, quit, subscribe, unsubscribe", stdout); |
142 |
fputs("\n (all else are sent verbatim to server)\n\n", stdout); |
143 |
|
144 |
} |
145 |
|
146 |
void client_prompt (void) |
147 |
{ |
148 |
fputs("lscp_client> ", stdout); |
149 |
} |
150 |
|
151 |
int main (int argc, char *argv[] ) |
152 |
{ |
153 |
lscp_client_t *pClient; |
154 |
char *pszHost = "localhost"; |
155 |
char szLine[1024]; |
156 |
int cchLine; |
157 |
lscp_status_t ret; |
158 |
|
159 |
#if defined(WIN32) |
160 |
if (WSAStartup(MAKEWORD(1, 1), &_wsaData) != 0) { |
161 |
fprintf(stderr, "lscp_client: WSAStartup failed.\n"); |
162 |
return -1; |
163 |
} |
164 |
#endif |
165 |
|
166 |
if (argc > 1) |
167 |
pszHost = argv[1]; |
168 |
|
169 |
pClient = lscp_client_create(pszHost, SERVER_PORT, client_callback, NULL); |
170 |
if (pClient == NULL) |
171 |
return -1; |
172 |
|
173 |
client_usage(); |
174 |
client_prompt(); |
175 |
|
176 |
while (fgets(szLine, sizeof(szLine) - 3, stdin)) { |
177 |
|
178 |
cchLine = strlen(szLine); |
179 |
while (cchLine > 0 && (szLine[cchLine - 1] == '\n' || szLine[cchLine - 1] == '\r')) |
180 |
cchLine--; |
181 |
szLine[cchLine] = '\0'; |
182 |
|
183 |
if (strcmp(szLine, "exit") == 0 || strcmp(szLine, "quit") == 0) |
184 |
break; |
185 |
else |
186 |
if (strcmp(szLine, "subscribe") == 0) |
187 |
lscp_client_subscribe(pClient, LSCP_EVENT_MISCELLANEOUS); |
188 |
else |
189 |
if (strcmp(szLine, "unsubscribe") == 0) |
190 |
lscp_client_unsubscribe(pClient, LSCP_EVENT_MISCELLANEOUS); |
191 |
else |
192 |
if (strcmp(szLine, "test") == 0) |
193 |
client_test(pClient); |
194 |
else |
195 |
if (cchLine > 0 && strcmp(szLine, "help") != 0) { |
196 |
szLine[cchLine++] = '\r'; |
197 |
szLine[cchLine++] = '\n'; |
198 |
szLine[cchLine] = '\0'; |
199 |
ret = lscp_client_query(pClient, szLine); |
200 |
printf("%s\n(errno = %d)\n", lscp_client_get_result(pClient), lscp_client_get_errno(pClient)); |
201 |
if (ret == LSCP_QUIT) |
202 |
break; |
203 |
} |
204 |
else client_usage(); |
205 |
|
206 |
client_prompt(); |
207 |
} |
208 |
|
209 |
lscp_client_destroy(pClient); |
210 |
|
211 |
#if defined(WIN32) |
212 |
WSACleanup(); |
213 |
#endif |
214 |
|
215 |
return 0; |
216 |
} |
217 |
|
218 |
// end of example_client.c |