/[svn]/liblscp/trunk/examples/example_server.c
ViewVC logotype

Annotation of /liblscp/trunk/examples/example_server.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 921 - (hide annotations) (download)
Sun Sep 24 12:55:48 2006 UTC (17 years, 6 months ago) by capela
File MIME type: text/plain
File size: 28601 byte(s)
GPL address update.

1 capela 105 // example_server.c
2     //
3     /****************************************************************************
4 capela 921 liblscp - LinuxSampler Control Protocol API
5 capela 869 Copyright (C) 2004-2006, rncbc aka Rui Nuno Capela. All rights reserved.
6 capela 105
7     This program is free software; you can redistribute it and/or
8     modify it under the terms of the GNU General Public License
9     as published by the Free Software Foundation; either version 2
10     of the License, or (at your option) any later version.
11    
12     This program is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15     GNU General Public License for more details.
16    
17 capela 921 You should have received a copy of the GNU General Public License along
18     with this program; if not, write to the Free Software Foundation, Inc.,
19     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 capela 105
21     *****************************************************************************/
22    
23     #include "server.h"
24     #include "parser.h"
25    
26     #include <time.h>
27    
28     #define SERVER_PORT 8888
29    
30     #if defined(WIN32)
31     static WSADATA _wsaData;
32     #endif
33    
34     ////////////////////////////////////////////////////////////////////////
35    
36     lscp_status_t server_callback ( lscp_connect_t *pConnect, const char *pchBuffer, int cchBuffer, void *pvData )
37     {
38     lscp_status_t ret = LSCP_OK;
39     lscp_parser_t tok;
40     const char *pszResult = NULL;
41     char szTemp[256];
42 capela 125 int i;
43 capela 171 static int iSamplerChannel = 0;
44     static int iAudioDevice = 0;
45     static int iMidiDevice = 0;
46 capela 105
47     if (pchBuffer == NULL) {
48     fprintf(stderr, "server_callback: addr=%s port=%d: ",
49     inet_ntoa(pConnect->client.addr.sin_addr),
50     htons(pConnect->client.addr.sin_port));
51     switch (cchBuffer) {
52     case LSCP_CONNECT_OPEN:
53     fprintf(stderr, "New client connection.\n");
54     break;
55     case LSCP_CONNECT_CLOSE:
56     fprintf(stderr, "Connection closed.\n");
57     break;
58     }
59     return ret;
60     }
61    
62     lscp_socket_trace("server_callback", &(pConnect->client.addr), pchBuffer, cchBuffer);
63    
64     lscp_parser_init(&tok, pchBuffer, cchBuffer);
65    
66     if (lscp_parser_test(&tok, "GET")) {
67     if (lscp_parser_test(&tok, "CHANNEL")) {
68     if (lscp_parser_test(&tok, "INFO")) {
69     // Getting sampler channel informations:
70     // GET CHANNEL INFO <sampler-channel>
71     pszResult = "ENGINE_NAME: DummyEngine\r\n"
72     "INSTRUMENT_FILE: DummyInstrument.gig\r\n"
73     "INSTRUMENT_NR: 0\r\n"
74 capela 380 "INSTRUMENT_NAME: Dummy Instrument\r\n"
75 capela 144 "INSTRUMENT_STATUS: 100\r\n"
76 capela 105 "AUDIO_OUTPUT_DEVICE: 0\r\n"
77     "AUDIO_OUTPUT_CHANNELS: 2\r\n"
78     "AUDIO_OUTPUT_ROUTING: 0,1\r\n"
79     "MIDI_INPUT_DEVICE: 0\r\n"
80     "MIDI_INPUT_PORT: 0\r\n"
81     "MIDI_INPUT_CHANNEL: ALL\r\n"
82 capela 735 "VOLUME: 0.5\r\n"
83     "MUTE: FALSE\r\n"
84     "SOLO: TRUE\r\n";
85 capela 105 }
86     else if (lscp_parser_test(&tok, "VOICE_COUNT")) {
87     // Current number of active voices:
88     // GET CHANNEL VOICE_COUNT <sampler-channel>
89     sprintf(szTemp, "%d", rand() % 100);
90     pszResult = szTemp;
91     }
92     else if (lscp_parser_test(&tok, "STREAM_COUNT")) {
93     // Current number of active disk streams:
94     // GET CHANNEL STREAM_COUNT <sampler-channel>
95     pszResult = "3\r\n";
96     }
97     else if (lscp_parser_test(&tok, "BUFFER_FILL")) {
98     if (lscp_parser_test(&tok, "BYTES")) {
99     // Current fill state of disk stream buffers:
100     // GET CHANNEL BUFFER_FILL BYTES <sampler-channel>
101     sprintf(szTemp, "[1]%d,[2]%d,[3]%d\r\n", rand(), rand(), rand());
102     pszResult = szTemp;
103     }
104     else if (lscp_parser_test(&tok, "PERCENTAGE")) {
105     // Current fill state of disk stream buffers:
106     // GET CHANNEL BUFFER_FILL PERCENTAGE <sampler-channel>
107     sprintf(szTemp, "[1]%d%%,[2]%d%%,[3]%d%%\r\n", rand() % 100, rand() % 100, rand() % 100);
108     pszResult = szTemp;
109     }
110     else ret = LSCP_FAILED;
111     }
112     else ret = LSCP_FAILED;
113     }
114     else if (lscp_parser_test(&tok, "CHANNELS")) {
115     // Current number of sampler channels:
116     // GET CHANNELS
117 capela 171 sprintf(szTemp, "%d", iSamplerChannel);
118 capela 105 pszResult = szTemp;
119     }
120     else if (lscp_parser_test(&tok, "AVAILABLE_AUDIO_OUTPUT_DRIVERS")) {
121 capela 523 // Getting all available audio output driver count.
122 capela 105 // GET AVAILABLE_AUDIO_OUTPUT_DRIVERS
123 capela 523 pszResult = "2\r\n";
124 capela 105 }
125     else if (lscp_parser_test(&tok, "AVAILABLE_MIDI_INPUT_DRIVERS")) {
126 capela 523 // Getting all available MIDI input driver count.
127 capela 105 // GET AVAILABLE_MIDI_INPUT_DRIVERS
128 capela 523 pszResult = "1\r\n";
129 capela 105 }
130     else if (lscp_parser_test2(&tok, "AUDIO_OUTPUT_DRIVER", "INFO")) {
131     // Getting informations about a specific audio output driver.
132     // GET AUDIO_OUTPUT_DRIVER INFO <audio-output-type>
133 capela 163 if (lscp_parser_test(&tok, "Alsa")) {
134 capela 105 pszResult = "DESCRIPTION: 'ALSA PCM'\r\n"
135     "VERSION: '1.0'\r\n"
136 capela 189 "PARAMETERS: channels,samplerate,active\r\n";
137 capela 105 }
138 capela 163 else if (lscp_parser_test(&tok, "Jack")) {
139     pszResult = "DESCRIPTION: JACK Audio Connection Kit\r\n"
140 capela 105 "VERSION: 0.98.1\r\n"
141 capela 163 "PARAMETERS: channels,samplerate,active\r\n";
142 capela 105 }
143     else ret = LSCP_FAILED;
144     }
145     else if (lscp_parser_test2(&tok, "MIDI_INPUT_DRIVER", "INFO")) {
146     // Getting informations about a specific MIDI input driver.
147     // GET MIDI_INPUT_DRIVER INFO <midi-input-type>
148 capela 163 if (lscp_parser_test(&tok, "Alsa")) {
149 capela 105 pszResult = "DESCRIPTION: ALSA Sequencer\r\n"
150     "VERSION: 1.0\r\n"
151 capela 163 "PARAMETERS: ports,active\r\n";
152 capela 105 }
153     else ret = LSCP_FAILED;
154     }
155 capela 163 else if (lscp_parser_test2(&tok, "AUDIO_OUTPUT_DRIVER_PARAMETER", "INFO")) {
156     // Getting informations about a specific audio output driver parameter.
157     // GET AUDIO_OUTPUT_DRIVER_PARAMETER INFO <audio-output-type> <param>
158 capela 189 if (lscp_parser_test(&tok, "Alsa")) {
159     if (lscp_parser_test(&tok, "active")) {
160     pszResult = "DESCRIPTION: 'ALSA PCM active state'\r\n"
161     "TYPE: BOOL\r\n"
162     "MANDATORY: TRUE\r\n"
163     "FIX: TRUE\r\n"
164     "MULTIPLICITY: FALSE\r\n"
165     "DEPENDS: channels,samplerate,card\r\n"
166     "DEFAULT: TRUE\r\n"
167     "RANGE_MIN: FALSE\r\n"
168     "RANGE_MAX: TRUE\r\n"
169     "POSSIBILITIES: FALSE,TRUE\r\n";
170     }
171     else if (lscp_parser_test(&tok, "channels")) {
172     pszResult = "DESCRIPTION: 'Number of ALSA PCM channels'\r\n"
173     "TYPE: INT\r\n"
174     "MANDATORY: TRUE\r\n"
175     "FIX: TRUE\r\n"
176     "MULTIPLICITY: FALSE\r\n"
177     "DEFAULT: 2\r\n";
178     }
179     else if (lscp_parser_test(&tok, "samplerate")) {
180     pszResult = "DESCRIPTION: 'ALSA PCM sample rate'\r\n"
181     "TYPE: INT\r\n"
182     "MANDATORY: TRUE\r\n"
183     "FIX: TRUE\r\n"
184     "MULTIPLICITY: TRUE\r\n"
185     "DEFAULT: 44100\r\n"
186     "POSSIBILITIES: 44100,48000,96000\r\n";
187     }
188     else ret = LSCP_FAILED;
189 capela 163 }
190 capela 189 else if (lscp_parser_test(&tok, "Jack")) {
191     if (lscp_parser_test(&tok, "active")) {
192     pszResult = "DESCRIPTION: 'JACK active state'\r\n"
193     "TYPE: BOOL\r\n"
194     "MANDATORY: TRUE\r\n"
195     "FIX: TRUE\r\n"
196     "MULTIPLICITY: FALSE\r\n"
197     "DEPENDS: channels,samplerate\r\n"
198     "DEFAULT: TRUE\r\n"
199     "RANGE_MIN: FALSE\r\n"
200     "RANGE_MAX: TRUE\r\n"
201     "POSSIBILITIES: FALSE,TRUE\r\n";
202     }
203     else if (lscp_parser_test(&tok, "channels")) {
204     pszResult = "DESCRIPTION: 'Number of JACK audio channels'\r\n"
205     "TYPE: INT\r\n"
206     "MANDATORY: TRUE\r\n"
207     "FIX: TRUE\r\n"
208     "MULTIPLICITY: FALSE\r\n"
209     "DEFAULT: 2\r\n";
210     }
211     else if (lscp_parser_test(&tok, "samplerate")) {
212     pszResult = "DESCRIPTION: 'JACK sample rate'\r\n"
213     "TYPE: INT\r\n"
214     "MANDATORY: TRUE\r\n"
215     "FIX: TRUE\r\n"
216     "MULTIPLICITY: TRUE\r\n"
217     "DEFAULT: 44100\r\n"
218     "POSSIBILITIES: 44100,48000,96000\r\n";
219     }
220     else ret = LSCP_FAILED;
221 capela 163 }
222     else ret = LSCP_FAILED;
223     }
224     else if (lscp_parser_test2(&tok, "MIDI_INPUT_DRIVER_PARAMETER", "INFO")) {
225     // Getting informations about a specific MIDI input driver parameter.
226     // GET MIDI_INPUT_DRIVER_PARAMETER INFO <midi-input-type> <param>
227 capela 189 if (lscp_parser_test(&tok, "Alsa")) {
228     if (lscp_parser_test(&tok, "active")) {
229     pszResult = "DESCRIPTION: 'ALSA Sequencer device active state'\r\n"
230     "TYPE: BOOL\r\n"
231     "MANDATORY: TRUE\r\n"
232     "FIX: TRUE\r\n"
233     "MULTIPLICITY: FALSE\r\n"
234     "DEPENDS: channels,ports\r\n"
235     "DEFAULT: TRUE\r\n"
236     "RANGE_MIN: FALSE\r\n"
237     "RANGE_MAX: TRUE\r\n"
238     "POSSIBILITIES: FALSE,TRUE\r\n";
239     }
240     else if (lscp_parser_test(&tok, "ports")) {
241     pszResult = "DESCRIPTION: 'Number of ALSA Sequencer ports'\r\n"
242     "TYPE: INT\r\n"
243     "MANDATORY: FALSE\r\n"
244     "FIX: FALSE\r\n"
245     "MULTIPLICITY: FALSE\r\n"
246     "DEFAULT: 1\r\n"
247     "RANGE_MIN: 1\r\n"
248     "RANGE_MAX: 4\r\n";
249     }
250     else ret = LSCP_FAILED;
251 capela 163 }
252     else ret = LSCP_FAILED;
253     }
254 capela 171 else if (lscp_parser_test2(&tok, "AUDIO_OUTPUT_DEVICE", "INFO")) {
255     // Getting informations about a specific audio output device.
256     // GET AUDIO_OUTPUT_DEVICE INFO <audio-device-id>
257     if (lscp_parser_nextint(&tok) < iAudioDevice) {
258     pszResult = "driver: Alsa\r\n"
259     "active: TRUE\r\n"
260     "channels: 2\r\n"
261     "samplerate: 44100\r\n";
262     }
263     else ret = LSCP_FAILED;
264     }
265     else if (lscp_parser_test2(&tok, "MIDI_INPUT_DEVICE", "INFO")) {
266     // Getting informations about a specific MIDI input device.
267     // GET MIDI_INPUT_DEVICE INFO <midi-device-id>
268     if (lscp_parser_nextint(&tok) < iMidiDevice) {
269     pszResult = "driver: Alsa\r\n"
270     "active: TRUE\r\n"
271     "channels: 16\r\n"
272     "ports: 1\r\n";
273     }
274     else ret = LSCP_FAILED;
275     }
276 capela 189 else if (lscp_parser_test2(&tok, "AUDIO_OUTPUT_CHANNEL", "INFO")) {
277     // Getting informations about an audio channel.
278     // GET AUDIO_OUTPUT_CHANNEL INFO <audio-device-id> <audio-channel>
279     if (lscp_parser_nextint(&tok) < iAudioDevice) {
280     pszResult = "name: DummyMonitor\r\n"
281     "is_mix_channel: FALSE\r\n"
282     "mix_channel_destination: 0\r\n";
283     }
284     else ret = LSCP_FAILED;
285     }
286     else if (lscp_parser_test2(&tok, "MIDI_INPUT_PORT", "INFO")) {
287     // Getting informations about a MIDI port.
288     // GET MIDI_INPUT_PORT INFO <midi-device-id> <midi-port>
289     if (lscp_parser_nextint(&tok) < iMidiDevice) {
290     pszResult = "name: DummyKeyboard\r\n"
291     "alsa_seq_bindings: '64:0'\r\n";
292     }
293     else ret = LSCP_FAILED;
294     }
295     else if (lscp_parser_test2(&tok, "AUDIO_OUTPUT_CHANNEL_PARAMETER", "INFO")) {
296     // Getting informations about specific audio channel parameter.
297     // GET AUDIO_OUTPUT_CHANNEL_PARAMETER INFO <audio-device-id> <audio-channel> <param>
298     if (lscp_parser_nextint(&tok) < iAudioDevice) {
299     lscp_parser_nextint(&tok);
300     if (lscp_parser_test(&tok, "is_mix_channel")) {
301     pszResult = "DESCRIPTION: 'Whether this is an audio mix channel'\r\n"
302     "TYPE: BOOL\r\n"
303     "MANDATORY: TRUE\r\n"
304     "FIX: FALSE\r\n"
305     "MULTIPLICITY: FALSE\r\n"
306     "POSSIBILITIES: FALSE,TRUE\r\n";
307     }
308     else if (lscp_parser_test(&tok, "mix_channel_destination")) {
309     pszResult = "DESCRIPTION: 'Audio mix channel destination'\r\n"
310     "TYPE: INT\r\n"
311     "MANDATORY: TRUE\r\n"
312     "FIX: FALSE\r\n"
313     "MULTIPLICITY: TRUE\r\n"
314     "POSSIBILITIES: 0,1\r\n";
315     }
316     else ret = LSCP_FAILED;
317     }
318     else ret = LSCP_FAILED;
319     }
320     else if (lscp_parser_test2(&tok, "MIDI_INPUT_PORT_PARAMETER", "INFO")) {
321     // Getting informations about specific MIDI port parameter.
322     // GET MIDI_INPUT_PORT_PARAMETER INFO <midi-device-id> <midi-port> <param>
323     if (lscp_parser_nextint(&tok) < iMidiDevice) {
324     lscp_parser_nextint(&tok);
325     if (lscp_parser_test(&tok, "alsa_seq_bindings")) {
326     pszResult = "DESCRIPTION: 'Alsa sequencer port bindings'\r\n"
327     "TYPE: STRING\r\n"
328     "MANDATORY: TRUE\r\n"
329     "FIX: FALSE\r\n"
330     "MULTIPLICITY: TRUE\r\n"
331     "POSSIBILITIES: '64:0','68:0','68:1'\r\n";
332     }
333     else ret = LSCP_FAILED;
334     }
335     else ret = LSCP_FAILED;
336     }
337 capela 188 else if (lscp_parser_test(&tok, "AUDIO_OUTPUT_DEVICES")) {
338     // Getting all created audio output device count.
339     // GET AUDIO_OUTPUT_DEVICES
340     sprintf(szTemp, "%d\r\n", iAudioDevice);
341     pszResult = szTemp;
342     }
343     else if (lscp_parser_test(&tok, "MIDI_INPUT_DEVICES")) {
344     // Getting all created MID input device count.
345     // GET MIDI_INPUT_DEVICES
346     sprintf(szTemp, "%d\r\n", iMidiDevice);
347     pszResult = szTemp;
348     }
349 capela 105 else if (lscp_parser_test(&tok, "AVAILABLE_ENGINES")) {
350 capela 523 // Getting all available engine count:
351 capela 105 // GET AVAILABLE_ENGINES
352 capela 523 pszResult = "3\r\n";
353 capela 105 }
354 capela 564 else if (lscp_parser_test2(&tok, "SERVER", "INFO")) {
355     // Getting information about the server.
356     // GET SERVER INFO
357     sprintf(szTemp, "DESCRIPTION: example_server (%s) %s\r\n"
358     "VERSION: %s\r\n", lscp_server_package(),
359     lscp_server_build(), lscp_server_version());
360     pszResult = szTemp;
361     }
362 capela 105 else if (lscp_parser_test2(&tok, "ENGINE", "INFO")) {
363     // Getting information about an engine.
364     // GET ENGINE INFO <engine-name>
365 capela 163 if (lscp_parser_test(&tok, "GigEngine")) {
366     pszResult = "DESCRIPTION: GigaSampler Engine\r\n"
367     "VERSION: 0.3\r\n";
368     }
369     else if (lscp_parser_test(&tok, "DLSEngine")) {
370     pszResult = "DESCRIPTION: 'DLS Generic Engine'\r\n"
371     "VERSION: 0.2\r\n";
372     }
373     else if (lscp_parser_test(&tok, "AkaiEngine")) {
374     pszResult = "DESCRIPTION: Akai Sampler Engine\r\n"
375     "VERSION: 0.1\r\n";
376     }
377     else ret = LSCP_FAILED;
378 capela 105 }
379     else ret = LSCP_FAILED;
380     }
381 capela 125 else if (lscp_parser_test(&tok, "LIST")) {
382     if (lscp_parser_test(&tok, "CHANNELS")) {
383     // Getting all created sampler channel list.
384 capela 188 // LIST CHANNELS
385 capela 171 if (iSamplerChannel > 0) {
386 capela 125 strcpy(szTemp, "0");
387 capela 177 for (i = 1; i < iSamplerChannel && strlen(szTemp) < sizeof(szTemp) - 8; i++)
388 capela 125 sprintf(szTemp + strlen(szTemp), ",%d", i);
389     strcat(szTemp, "\r\n");
390     pszResult = szTemp;
391     }
392     else ret = LSCP_FAILED;
393     }
394 capela 523 else if (lscp_parser_test(&tok, "AVAILABLE_ENGINES")) {
395     // Getting all available engines:
396     // LIST AVAILABLE_ENGINES
397     pszResult = "GigEngine,DLSEngine,AkaiEngine\r\n";
398     }
399     else if (lscp_parser_test(&tok, "AVAILABLE_AUDIO_OUTPUT_DRIVERS")) {
400     // Getting all available audio output drivers.
401     // LIST AVAILABLE_AUDIO_OUTPUT_DRIVERS
402     pszResult = "ALSA,JACK\r\n";
403     }
404     else if (lscp_parser_test(&tok, "AVAILABLE_MIDI_INPUT_DRIVERS")) {
405     // Getting all available MIDI input drivers.
406     // LIST AVAILABLE_MIDI_INPUT_DRIVERS
407     pszResult = "ALSA\r\n";
408     }
409 capela 125 else if (lscp_parser_test(&tok, "AUDIO_OUTPUT_DEVICES")) {
410     // Getting all created audio output device list.
411 capela 188 // LIST AUDIO_OUTPUT_DEVICES
412 capela 171 if (iAudioDevice > 0) {
413     strcpy(szTemp, "0");
414 capela 177 for (i = 1; i < iAudioDevice && strlen(szTemp) < sizeof(szTemp) - 8; i++)
415 capela 171 sprintf(szTemp + strlen(szTemp), ",%d", i);
416     strcat(szTemp, "\r\n");
417     pszResult = szTemp;
418     }
419     else ret = LSCP_FAILED;
420 capela 125 }
421     else if (lscp_parser_test(&tok, "MIDI_INPUT_DEVICES")) {
422     // Getting all created MID input device list.
423 capela 188 // LIST MIDI_INPUT_DEVICES
424 capela 171 if (iMidiDevice > 0) {
425     strcpy(szTemp, "0");
426 capela 177 for (i = 1; i < iMidiDevice && strlen(szTemp) < sizeof(szTemp) - 8; i++)
427 capela 171 sprintf(szTemp + strlen(szTemp), ",%d", i);
428     strcat(szTemp, "\r\n");
429     pszResult = szTemp;
430     }
431     else ret = LSCP_FAILED;
432 capela 125 }
433     else ret = LSCP_FAILED;
434     }
435 capela 105 else if (lscp_parser_test(&tok, "SET")) {
436     if (lscp_parser_test(&tok, "CHANNEL")) {
437     if (lscp_parser_test(&tok, "VOLUME")) {
438     // Setting channel volume:
439     // SET CHANNEL VOLUME <sampler-channel> <volume>
440     }
441 capela 735 else if (lscp_parser_test(&tok, "MUTE")) {
442     // Muting a sampler channel:
443     // SET CHANNEL MUTE <sampler-channel> <mute>
444     }
445     else if (lscp_parser_test(&tok, "SOLO")) {
446     // Soloing a sampler channel:
447     // SET CHANNEL SOLO <sampler-channel> <solo>
448     }
449 capela 105 else if (lscp_parser_test(&tok, "AUDIO_OUTPUT_TYPE")) {
450     // Setting audio output type:
451     // SET CHANNEL AUDIO_OUTPUT_TYPE <sampler-channel> <audio-output-type>
452     }
453 capela 125 else if (lscp_parser_test(&tok, "AUDIO_OUTPUT_DEVICE")) {
454     // Setting audio output device:
455     // SET CHANNEL AUDIO_OUTPUT_DEVICE <sampler-channel> <device-id>
456     }
457 capela 105 else if (lscp_parser_test(&tok, "AUDIO_OUTPUT_CHANNEL")) {
458     // Setting audio output channel:
459 capela 125 // SET CHANNEL AUDIO_OUTPUT_CHANNEL <sampler-channel> <audio-in> <audio-out>
460 capela 105 }
461     else if (lscp_parser_test(&tok, "MIDI_INPUT_TYPE")) {
462     // Setting MIDI input type:
463     // SET CHANNEL MIDI_INPUT_TYPE <sampler-channel> <midi-input-type>
464     }
465 capela 125 else if (lscp_parser_test(&tok, "MIDI_INPUT_DEVICE")) {
466     // Setting MIDI input device:
467     // SET CHANNEL MIDI_INPUT_DEVICE <sampler-channel> <device-id>
468     }
469 capela 105 else if (lscp_parser_test(&tok, "MIDI_INPUT_PORT")) {
470     // Setting MIDI input port:
471     // SET CHANNEL MIDI_INPUT_PORT <sampler-channel> <midi-input-port>
472     }
473     else if (lscp_parser_test(&tok, "MIDI_INPUT_CHANNEL")) {
474     // Setting MIDI input channel:
475     // SET CHANNEL MIDI_INPUT_CHANNEL <sampler-channel> <midi-input-chan>
476     }
477     else ret = LSCP_FAILED;
478     }
479     else ret = LSCP_FAILED;
480     }
481     else if (lscp_parser_test(&tok, "LOAD")) {
482     if (lscp_parser_test(&tok, "ENGINE")) {
483     // Loading a sampler engine:
484     // LOAD ENGINE <engine-name> <sampler-channel>
485     }
486     else if (lscp_parser_test(&tok, "INSTRUMENT")) {
487     // Loading an instrument:
488 capela 144 // LOAD INSTRUMENT [NON_MODAL] <filename> <instr-index> <sampler-channel>
489 capela 105 }
490     else ret = LSCP_FAILED;
491     }
492     else if (lscp_parser_test2(&tok, "ADD", "CHANNEL")) {
493     // Adding a new sampler channel:
494     // ADD CHANNEL
495 capela 187 if (iSamplerChannel < 16) {
496 capela 189 sprintf(szTemp, "OK[%d]", iSamplerChannel++);
497 capela 187 pszResult = szTemp;
498     } else {
499     iSamplerChannel = 0;
500     ret = LSCP_FAILED;
501     }
502 capela 105 }
503     else if (lscp_parser_test2(&tok, "REMOVE", "CHANNEL")) {
504     // Removing a sampler channel:
505     // REMOVE CHANNEL <sampler-channel>
506 capela 188 if (lscp_parser_nextint(&tok) < iSamplerChannel)
507     iSamplerChannel--;
508     else
509 capela 171 ret = LSCP_FAILED;
510 capela 105 }
511 capela 213 else if (lscp_parser_test(&tok, "RESET")) {
512     if (lscp_parser_test(&tok, "CHANNEL")) {
513     // Resetting a sampler channel:
514     // RESET CHANNEL <sampler-channel>
515     if (lscp_parser_nextint(&tok) > iSamplerChannel)
516     ret = LSCP_FAILED;
517     } else {
518     // Reset sampler:
519     // RESET
520     iSamplerChannel = 0;
521     iAudioDevice = 0;
522     iMidiDevice = 0;
523     }
524 capela 105 }
525 capela 171 else if (lscp_parser_test(&tok, "CREATE")) {
526     if (lscp_parser_test(&tok, "AUDIO_OUTPUT_DEVICE")) {
527     // Creating an audio output device.
528     // CREATE AUDIO_OUTPUT_DEVICE <audio-output-driver> [<params>]
529 capela 187 if (iAudioDevice < 8) {
530     sprintf(szTemp, "OK[%d]", iAudioDevice++);
531     pszResult = szTemp;
532     } else {
533     iAudioDevice = 0;
534     ret = LSCP_FAILED;
535     }
536 capela 171 }
537     else if (lscp_parser_test(&tok, "MIDI_INPUT_DEVICE")) {
538     // Creating an MIDI input device.
539     // CREATE MIDI_INPUT_DEVICE <midi-input-driver> [<params>]
540 capela 187 if (iMidiDevice < 8) {
541     sprintf(szTemp, "OK[%d]", iMidiDevice++);
542     pszResult = szTemp;
543     } else {
544     iMidiDevice = 0;
545     ret = LSCP_FAILED;
546     }
547 capela 171 }
548     else ret = LSCP_FAILED;
549     }
550     else if (lscp_parser_test(&tok, "DESTROY")) {
551     if (lscp_parser_test(&tok, "AUDIO_OUTPUT_DEVICE")) {
552     // Destroying an audio output device.
553     // DESTROY AUDIO_OUTPUT_DEVICE <audio-device-id>
554 capela 188 if (lscp_parser_nextint(&tok) < iAudioDevice)
555     iAudioDevice--;
556     else
557 capela 171 ret = LSCP_FAILED;
558     }
559     else if (lscp_parser_test(&tok, "MIDI_INPUT_DEVICE")) {
560     // Destroying an MIDI intput device.
561     // DESTROY MIDI_INPUT_DEVICE <midi-device-id>
562 capela 188 if (lscp_parser_nextint(&tok) < iMidiDevice)
563     iMidiDevice--;
564     else
565 capela 171 ret = LSCP_FAILED;
566     }
567     else ret = LSCP_FAILED;
568     }
569 capela 146 else if (lscp_parser_test(&tok, "SUBSCRIBE")) {
570     // Register frontend for receiving event notification messages:
571     // SUBSCRIBE <event>
572     ret = lscp_server_subscribe(pConnect, lscp_event_from_text(lscp_parser_next(&tok)));
573 capela 105 }
574 capela 146 else if (lscp_parser_test(&tok, "UNSUBSCRIBE")) {
575     // Deregister frontend for not receiving event notification messages anymore:
576     // UNSUBSCRIBE <event>
577     ret = lscp_server_unsubscribe(pConnect, lscp_event_from_text(lscp_parser_next(&tok)));
578 capela 105 }
579     else if (lscp_parser_test(&tok, "QUIT")) {
580     // Close client connection:
581     // QUIT
582     lscp_parser_free(&tok);
583     return LSCP_FAILED; // Disconnect.
584     }
585     else ret = LSCP_FAILED;
586    
587     lscp_parser_free(&tok);
588    
589     if (pszResult == NULL)
590     pszResult = (ret == LSCP_OK ? "OK\r\n" : "ERR:1:Failed\r\n");
591    
592     fprintf(stderr, "> %s", pszResult);
593    
594     return lscp_server_result(pConnect, pszResult, strlen(pszResult));
595     }
596    
597     ////////////////////////////////////////////////////////////////////////
598    
599 capela 189
600 capela 105 void server_usage (void)
601     {
602     printf("\n %s %s (Build: %s)\n", lscp_server_package(), lscp_server_version(), lscp_server_build());
603    
604     fputs("\n Available server commands: help, exit, quit, list", stdout);
605     fputs("\n (all else are broadcast verbatim to subscribers)\n\n", stdout);
606     }
607    
608     void server_prompt (void)
609     {
610     fputs("lscp_server> ", stdout);
611     }
612    
613     int main (int argc, char *argv[] )
614     {
615     lscp_server_t *pServer;
616     char szLine[200];
617     int cchLine;
618     lscp_connect_t *p;
619    
620     #if defined(WIN32)
621     if (WSAStartup(MAKEWORD(1, 1), &_wsaData) != 0) {
622     fprintf(stderr, "lscp_server: WSAStartup failed.\n");
623     return -1;
624     }
625     #endif
626    
627     srand(time(NULL));
628    
629     pServer = lscp_server_create(SERVER_PORT, server_callback, NULL);
630     if (pServer == NULL)
631     return -1;
632    
633     server_usage();
634     server_prompt();
635    
636     while (fgets(szLine, sizeof(szLine), stdin)) {
637    
638     cchLine = strlen(szLine);
639     while (cchLine > 0 && (szLine[cchLine - 1] == '\n' || szLine[cchLine - 1] == '\r'))
640     cchLine--;
641     szLine[cchLine] = '\0';
642    
643     if (strcmp(szLine, "exit") == 0 || strcmp(szLine, "quit") == 0)
644     break;
645     else
646     if (strcmp(szLine, "list") == 0) {
647     for (p = pServer->connects.first; p; p = p->next) {
648 capela 146 printf("client: sock=%d addr=%s port=%d events=0x%04x.\n",
649 capela 105 p->client.sock,
650     inet_ntoa(p->client.addr.sin_addr),
651     ntohs(p->client.addr.sin_port),
652 capela 146 (int) p->events
653 capela 105 );
654     }
655     }
656     else
657     if (cchLine > 0 && strcmp(szLine, "help") != 0)
658 capela 146 lscp_server_broadcast(pServer, LSCP_EVENT_MISCELLANEOUS, szLine, strlen(szLine));
659 capela 105 else
660     server_usage();
661    
662     server_prompt();
663     }
664    
665     lscp_server_destroy(pServer);
666    
667     #if defined(WIN32)
668     WSACleanup();
669     #endif
670    
671     return 0;
672     }
673    
674     // end of example_server.c

  ViewVC Help
Powered by ViewVC