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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 948 by capela, Tue Nov 28 15:31:20 2006 UTC revision 1019 by capela, Thu Jan 11 12:33:05 2007 UTC
# Line 2  Line 2 
2  //  //
3  /****************************************************************************  /****************************************************************************
4     liblscp - LinuxSampler Control Protocol API     liblscp - LinuxSampler Control Protocol API
5     Copyright (C) 2004-2006, rncbc aka Rui Nuno Capela. All rights reserved.     Copyright (C) 2004-2007, rncbc aka Rui Nuno Capela. All rights reserved.
6    
7     This program is free software; you can redistribute it and/or     This program is free software; you can redistribute it and/or
8     modify it under the terms of the GNU General Public License     modify it under the terms of the GNU General Public License
# Line 31  Line 31 
31  static WSADATA _wsaData;  static WSADATA _wsaData;
32  #endif  #endif
33    
34    
35  ////////////////////////////////////////////////////////////////////////  ////////////////////////////////////////////////////////////////////////
36    
37  lscp_status_t server_callback ( lscp_connect_t *pConnect, const char *pchBuffer, int cchBuffer, void *pvData )  lscp_status_t server_callback ( lscp_connect_t *pConnect, const char *pchBuffer, int cchBuffer, void *pvData )
38  {  {
39      lscp_status_t ret = LSCP_OK;          lscp_status_t ret = LSCP_OK;
40      lscp_parser_t tok;          lscp_parser_t tok;
41      const char *pszResult = NULL;          const char *pszResult = NULL;
42      char szTemp[4096];          char szTemp[4096];
43      int i;          int i;
44      static int iSamplerChannel = 0;          static int iSamplerChannel = 0;
45      static int iAudioDevice = 0;          static int iAudioDevice = 0;
46      static int iMidiDevice  = 0;          static int iMidiDevice  = 0;
47      static int iMidiInstruments = 0;          static int iMidiMaps = 0;
48            static int iMidiInstruments = 0;
49      if (pchBuffer == NULL) {          static float fVolume = 1.0f;
50          fprintf(stderr, "server_callback: addr=%s port=%d: ",  
51              inet_ntoa(pConnect->client.addr.sin_addr),          if (pchBuffer == NULL) {
52              htons(pConnect->client.addr.sin_port));                  fprintf(stderr, "server_callback: addr=%s port=%d: ",
53          switch (cchBuffer) {                          inet_ntoa(pConnect->client.addr.sin_addr),
54            case LSCP_CONNECT_OPEN:                          htons(pConnect->client.addr.sin_port));
55              fprintf(stderr, "New client connection.\n");                  switch (cchBuffer) {
56              break;                  case LSCP_CONNECT_OPEN:
57            case LSCP_CONNECT_CLOSE:                          fprintf(stderr, "New client connection.\n");
58              fprintf(stderr, "Connection closed.\n");                          break;
59              break;                  case LSCP_CONNECT_CLOSE:
60          }                          fprintf(stderr, "Connection closed.\n");
61          return ret;                          break;
62      }                  }
63                    return ret;
64      lscp_socket_trace("server_callback", &(pConnect->client.addr), pchBuffer, cchBuffer);          }
65    
66      lscp_parser_init(&tok, pchBuffer, cchBuffer);          lscp_socket_trace("server_callback", &(pConnect->client.addr), pchBuffer, cchBuffer);
67    
68      if (lscp_parser_test(&tok, "GET")) {          lscp_parser_init(&tok, pchBuffer, cchBuffer);
69          if (lscp_parser_test(&tok, "CHANNEL")) {  
70              if (lscp_parser_test(&tok, "INFO")) {          if (lscp_parser_test(&tok, "GET")) {
71                  // Getting sampler channel informations:                  if (lscp_parser_test(&tok, "CHANNEL")) {
72                  // GET CHANNEL INFO <sampler-channel>                          if (lscp_parser_test(&tok, "INFO")) {
73                  pszResult = "ENGINE_NAME: DummyEngine\r\n"                                  // Getting sampler channel informations:
74                              "INSTRUMENT_FILE: DummyInstrument.gig\r\n"                                  // GET CHANNEL INFO <sampler-channel>
75                              "INSTRUMENT_NR: 0\r\n"                                  pszResult = "ENGINE_NAME: DummyEngine\r\n"
76                              "INSTRUMENT_NAME: Dummy Instrument\r\n"                                                          "INSTRUMENT_FILE: DummyInstrument.gig\r\n"
77                              "INSTRUMENT_STATUS: 100\r\n"                                                          "INSTRUMENT_NR: 0\r\n"
78                              "AUDIO_OUTPUT_DEVICE: 0\r\n"                                                          "INSTRUMENT_NAME: Dummy Instrument\r\n"
79                              "AUDIO_OUTPUT_CHANNELS: 2\r\n"                                                          "INSTRUMENT_STATUS: 100\r\n"
80                              "AUDIO_OUTPUT_ROUTING: 0,1\r\n"                                                          "AUDIO_OUTPUT_DEVICE: 0\r\n"
81                              "MIDI_INPUT_DEVICE: 0\r\n"                                                          "AUDIO_OUTPUT_CHANNELS: 2\r\n"
82                              "MIDI_INPUT_PORT: 0\r\n"                                                          "AUDIO_OUTPUT_ROUTING: 0,1\r\n"
83                              "MIDI_INPUT_CHANNEL: ALL\r\n"                                                          "MIDI_INPUT_DEVICE: 0\r\n"
84                              "VOLUME: 0.5\r\n"                                                          "MIDI_INPUT_PORT: 0\r\n"
85                              "MUTE: FALSE\r\n"                                                          "MIDI_INPUT_CHANNEL: ALL\r\n"
86                              "SOLO: TRUE\r\n"                                                          "VOLUME: 0.5\r\n"
87                                                          ".\r\n";                                                          "MUTE: FALSE\r\n"
88              }                                                          "SOLO: TRUE\r\n"
89              else if (lscp_parser_test(&tok, "VOICE_COUNT")) {                                                          ".\r\n";
90                  // Current number of active voices:                          }
91                  // GET CHANNEL VOICE_COUNT <sampler-channel>                          else if (lscp_parser_test(&tok, "VOICE_COUNT")) {
92                  sprintf(szTemp, "%d\r\n", rand() % 100);                                  // Current number of active voices:
93                  pszResult = szTemp;                                  // GET CHANNEL VOICE_COUNT <sampler-channel>
94              }                                  sprintf(szTemp, "%d\r\n", rand() % 100);
95              else if (lscp_parser_test(&tok, "STREAM_COUNT")) {                                  pszResult = szTemp;
96                  // Current number of active disk streams:                          }
97                  // GET CHANNEL STREAM_COUNT <sampler-channel>                          else if (lscp_parser_test(&tok, "STREAM_COUNT")) {
98                  pszResult = "3\r\n";                                  // Current number of active disk streams:
99              }                                  // GET CHANNEL STREAM_COUNT <sampler-channel>
100              else if (lscp_parser_test(&tok, "BUFFER_FILL")) {                                  pszResult = "3\r\n";
101                  if (lscp_parser_test(&tok, "BYTES")) {                          }
102                      // Current fill state of disk stream buffers:                          else if (lscp_parser_test(&tok, "BUFFER_FILL")) {
103                      // GET CHANNEL BUFFER_FILL BYTES <sampler-channel>                                  if (lscp_parser_test(&tok, "BYTES")) {
104                      sprintf(szTemp, "[1]%d,[2]%d,[3]%d\r\n", rand(), rand(), rand());                                          // Current fill state of disk stream buffers:
105                      pszResult = szTemp;                                          // GET CHANNEL BUFFER_FILL BYTES <sampler-channel>
106                  }                                          sprintf(szTemp, "[1]%d,[2]%d,[3]%d\r\n", rand(), rand(), rand());
107                  else if (lscp_parser_test(&tok, "PERCENTAGE")) {                                          pszResult = szTemp;
108                      // Current fill state of disk stream buffers:                                  }
109                      // GET CHANNEL BUFFER_FILL PERCENTAGE <sampler-channel>                                  else if (lscp_parser_test(&tok, "PERCENTAGE")) {
110                      sprintf(szTemp, "[1]%d%%,[2]%d%%,[3]%d%%\r\n", rand() % 100, rand() % 100, rand() % 100);                                          // Current fill state of disk stream buffers:
111                      pszResult = szTemp;                                          // GET CHANNEL BUFFER_FILL PERCENTAGE <sampler-channel>
112                  }                                          sprintf(szTemp, "[1]%d%%,[2]%d%%,[3]%d%%\r\n", rand() % 100, rand() % 100, rand() % 100);
113                  else ret = LSCP_FAILED;                                          pszResult = szTemp;
114              }                                  }
115              else ret = LSCP_FAILED;                                  else ret = LSCP_FAILED;
116          }                          }
117          else if (lscp_parser_test(&tok, "CHANNELS")) {                          else ret = LSCP_FAILED;
118              // Current number of sampler channels:                  }
119              // GET CHANNELS                  else if (lscp_parser_test(&tok, "CHANNELS")) {
120              sprintf(szTemp, "%d\r\n", iSamplerChannel);                          // Current number of sampler channels:
121              pszResult = szTemp;                          // GET CHANNELS
122          }                          sprintf(szTemp, "%d\r\n", iSamplerChannel);
123          else if (lscp_parser_test(&tok, "AVAILABLE_AUDIO_OUTPUT_DRIVERS")) {                          pszResult = szTemp;
124              // Getting all available audio output driver count.                  }
125              // GET AVAILABLE_AUDIO_OUTPUT_DRIVERS                  else if (lscp_parser_test(&tok, "AVAILABLE_AUDIO_OUTPUT_DRIVERS")) {
126              pszResult = "2\r\n";                          // Getting all available audio output driver count.
127          }                          // GET AVAILABLE_AUDIO_OUTPUT_DRIVERS
128          else if (lscp_parser_test(&tok, "AVAILABLE_MIDI_INPUT_DRIVERS")) {                          pszResult = "2\r\n";
129              // Getting all available MIDI input driver count.                  }
130              // GET AVAILABLE_MIDI_INPUT_DRIVERS                  else if (lscp_parser_test(&tok, "AVAILABLE_MIDI_INPUT_DRIVERS")) {
131              pszResult = "1\r\n";                          // Getting all available MIDI input driver count.
132          }                          // GET AVAILABLE_MIDI_INPUT_DRIVERS
133          else if (lscp_parser_test2(&tok, "AUDIO_OUTPUT_DRIVER", "INFO")) {                          pszResult = "1\r\n";
134              // Getting informations about a specific audio output driver.                  }
135              // GET AUDIO_OUTPUT_DRIVER INFO <audio-output-type>                  else if (lscp_parser_test2(&tok, "AUDIO_OUTPUT_DRIVER", "INFO")) {
136              if (lscp_parser_test(&tok, "Alsa")) {                          // Getting informations about a specific audio output driver.
137                  pszResult = "DESCRIPTION: 'ALSA PCM'\r\n"                          // GET AUDIO_OUTPUT_DRIVER INFO <audio-output-type>
138                              "VERSION: '1.0'\r\n"                          if (lscp_parser_test(&tok, "Alsa")) {
139                              "PARAMETERS: channels,samplerate,active\r\n"                                  pszResult = "DESCRIPTION: 'ALSA PCM'\r\n"
140                              ".\r\n";                                                          "VERSION: '1.0'\r\n"
141              }                                                          "PARAMETERS: channels,samplerate,active\r\n"
142              else if (lscp_parser_test(&tok, "Jack")) {                                                          ".\r\n";
143                  pszResult = "DESCRIPTION: JACK Audio Connection Kit\r\n"                          }
144                              "VERSION: 0.98.1\r\n"                          else if (lscp_parser_test(&tok, "Jack")) {
145                              "PARAMETERS: channels,samplerate,active\r\n"                                  pszResult = "DESCRIPTION: JACK Audio Connection Kit\r\n"
146                              ".\r\n";                                                          "VERSION: 0.98.1\r\n"
147              }                                                          "PARAMETERS: channels,samplerate,active\r\n"
148              else ret = LSCP_FAILED;                                                          ".\r\n";
149          }                          }
150          else if (lscp_parser_test2(&tok, "MIDI_INPUT_DRIVER", "INFO")) {                          else ret = LSCP_FAILED;
151              // Getting informations about a specific MIDI input driver.                  }
152              // GET MIDI_INPUT_DRIVER INFO <midi-input-type>                  else if (lscp_parser_test2(&tok, "MIDI_INPUT_DRIVER", "INFO")) {
153              if (lscp_parser_test(&tok, "Alsa")) {                          // Getting informations about a specific MIDI input driver.
154                  pszResult = "DESCRIPTION: ALSA Sequencer\r\n"                          // GET MIDI_INPUT_DRIVER INFO <midi-input-type>
155                              "VERSION: 1.0\r\n"                          if (lscp_parser_test(&tok, "Alsa")) {
156                              "PARAMETERS: ports,active\r\n"                                  pszResult = "DESCRIPTION: ALSA Sequencer\r\n"
157                              ".\r\n";                                                          "VERSION: 1.0\r\n"
158              }                                                          "PARAMETERS: ports,active\r\n"
159              else ret = LSCP_FAILED;                                                          ".\r\n";
160          }                          }
161          else if (lscp_parser_test2(&tok, "AUDIO_OUTPUT_DRIVER_PARAMETER", "INFO")) {                          else ret = LSCP_FAILED;
162              // Getting informations about a specific audio output driver parameter.                  }
163              // GET AUDIO_OUTPUT_DRIVER_PARAMETER INFO <audio-output-type> <param>                  else if (lscp_parser_test2(&tok, "AUDIO_OUTPUT_DRIVER_PARAMETER", "INFO")) {
164              if (lscp_parser_test(&tok, "Alsa")) {                          // Getting informations about a specific audio output driver parameter.
165                  if (lscp_parser_test(&tok, "active")) {                          // GET AUDIO_OUTPUT_DRIVER_PARAMETER INFO <audio-output-type> <param>
166                      pszResult = "DESCRIPTION: 'ALSA PCM active state'\r\n"                          if (lscp_parser_test(&tok, "Alsa")) {
167                                  "TYPE: BOOL\r\n"                                  if (lscp_parser_test(&tok, "active")) {
168                                  "MANDATORY: TRUE\r\n"                                          pszResult = "DESCRIPTION: 'ALSA PCM active state'\r\n"
169                                  "FIX: TRUE\r\n"                                                                  "TYPE: BOOL\r\n"
170                                  "MULTIPLICITY: FALSE\r\n"                                                                  "MANDATORY: TRUE\r\n"
171                                  "DEPENDS: channels,samplerate,card\r\n"                                                                  "FIX: TRUE\r\n"
172                                  "DEFAULT: TRUE\r\n"                                                                  "MULTIPLICITY: FALSE\r\n"
173                                  "RANGE_MIN: FALSE\r\n"                                                                  "DEPENDS: channels,samplerate,card\r\n"
174                                  "RANGE_MAX: TRUE\r\n"                                                                  "DEFAULT: TRUE\r\n"
175                                  "POSSIBILITIES: FALSE,TRUE\r\n"                                                                  "RANGE_MIN: FALSE\r\n"
176                                  ".\r\n";                                                                  "RANGE_MAX: TRUE\r\n"
177                  }                                                                  "POSSIBILITIES: FALSE,TRUE\r\n"
178                  else if (lscp_parser_test(&tok, "channels")) {                                                                  ".\r\n";
179                      pszResult = "DESCRIPTION: 'Number of ALSA PCM channels'\r\n"                                  }
180                                  "TYPE: INT\r\n"                                  else if (lscp_parser_test(&tok, "channels")) {
181                                  "MANDATORY: TRUE\r\n"                                          pszResult = "DESCRIPTION: 'Number of ALSA PCM channels'\r\n"
182                                  "FIX: TRUE\r\n"                                                                  "TYPE: INT\r\n"
183                                  "MULTIPLICITY: FALSE\r\n"                                                                  "MANDATORY: TRUE\r\n"
184                                  "DEFAULT: 2\r\n"                                                                  "FIX: TRUE\r\n"
185                                  ".\r\n";                                                                  "MULTIPLICITY: FALSE\r\n"
186                  }                                                                  "DEFAULT: 2\r\n"
187                  else if (lscp_parser_test(&tok, "samplerate")) {                                                                  ".\r\n";
188                      pszResult = "DESCRIPTION: 'ALSA PCM sample rate'\r\n"                                  }
189                                  "TYPE: INT\r\n"                                  else if (lscp_parser_test(&tok, "samplerate")) {
190                                  "MANDATORY: TRUE\r\n"                                          pszResult = "DESCRIPTION: 'ALSA PCM sample rate'\r\n"
191                                  "FIX: TRUE\r\n"                                                                  "TYPE: INT\r\n"
192                                  "MULTIPLICITY: TRUE\r\n"                                                                  "MANDATORY: TRUE\r\n"
193                                  "DEFAULT: 44100\r\n"                                                                  "FIX: TRUE\r\n"
194                                  "POSSIBILITIES: 44100,48000,96000\r\n"                                                                  "MULTIPLICITY: TRUE\r\n"
195                                  ".\r\n";                                                                  "DEFAULT: 44100\r\n"
196                  }                                                                  "POSSIBILITIES: 44100,48000,96000\r\n"
197                  else ret = LSCP_FAILED;                                                                  ".\r\n";
198              }                                  }
199              else if (lscp_parser_test(&tok, "Jack")) {                                  else ret = LSCP_FAILED;
200                  if (lscp_parser_test(&tok, "active")) {                          }
201                      pszResult = "DESCRIPTION: 'JACK active state'\r\n"                          else if (lscp_parser_test(&tok, "Jack")) {
202                                  "TYPE: BOOL\r\n"                                  if (lscp_parser_test(&tok, "active")) {
203                                  "MANDATORY: TRUE\r\n"                                          pszResult = "DESCRIPTION: 'JACK active state'\r\n"
204                                  "FIX: TRUE\r\n"                                                                  "TYPE: BOOL\r\n"
205                                  "MULTIPLICITY: FALSE\r\n"                                                                  "MANDATORY: TRUE\r\n"
206                                  "DEPENDS: channels,samplerate\r\n"                                                                  "FIX: TRUE\r\n"
207                                  "DEFAULT: TRUE\r\n"                                                                  "MULTIPLICITY: FALSE\r\n"
208                                  "RANGE_MIN: FALSE\r\n"                                                                  "DEPENDS: channels,samplerate\r\n"
209                                  "RANGE_MAX: TRUE\r\n"                                                                  "DEFAULT: TRUE\r\n"
210                                  "POSSIBILITIES: FALSE,TRUE\r\n"                                                                  "RANGE_MIN: FALSE\r\n"
211                                  ".\r\n";                                                                  "RANGE_MAX: TRUE\r\n"
212                  }                                                                  "POSSIBILITIES: FALSE,TRUE\r\n"
213                  else if (lscp_parser_test(&tok, "channels")) {                                                                  ".\r\n";
214                      pszResult = "DESCRIPTION: 'Number of JACK audio channels'\r\n"                                  }
215                                  "TYPE: INT\r\n"                                  else if (lscp_parser_test(&tok, "channels")) {
216                                  "MANDATORY: TRUE\r\n"                                          pszResult = "DESCRIPTION: 'Number of JACK audio channels'\r\n"
217                                  "FIX: TRUE\r\n"                                                                  "TYPE: INT\r\n"
218                                  "MULTIPLICITY: FALSE\r\n"                                                                  "MANDATORY: TRUE\r\n"
219                                  "DEFAULT: 2\r\n"                                                                  "FIX: TRUE\r\n"
220                                  ".\r\n";                                                                  "MULTIPLICITY: FALSE\r\n"
221                  }                                                                  "DEFAULT: 2\r\n"
222                  else if (lscp_parser_test(&tok, "samplerate")) {                                                                  ".\r\n";
223                      pszResult = "DESCRIPTION: 'JACK sample rate'\r\n"                                  }
224                                  "TYPE: INT\r\n"                                  else if (lscp_parser_test(&tok, "samplerate")) {
225                                  "MANDATORY: TRUE\r\n"                                          pszResult = "DESCRIPTION: 'JACK sample rate'\r\n"
226                                  "FIX: TRUE\r\n"                                                                  "TYPE: INT\r\n"
227                                  "MULTIPLICITY: TRUE\r\n"                                                                  "MANDATORY: TRUE\r\n"
228                                  "DEFAULT: 44100\r\n"                                                                  "FIX: TRUE\r\n"
229                                  "POSSIBILITIES: 44100,48000,96000\r\n"                                                                  "MULTIPLICITY: TRUE\r\n"
230                                  ".\r\n";                                                                  "DEFAULT: 44100\r\n"
231                  }                                                                  "POSSIBILITIES: 44100,48000,96000\r\n"
232                  else ret = LSCP_FAILED;                                                                  ".\r\n";
233              }                                  }
234              else ret = LSCP_FAILED;                                  else ret = LSCP_FAILED;
235          }                          }
236          else if (lscp_parser_test2(&tok, "MIDI_INPUT_DRIVER_PARAMETER", "INFO")) {                          else ret = LSCP_FAILED;
237              // Getting informations about a specific MIDI input driver parameter.                  }
238              // GET MIDI_INPUT_DRIVER_PARAMETER INFO <midi-input-type> <param>                  else if (lscp_parser_test2(&tok, "MIDI_INPUT_DRIVER_PARAMETER", "INFO")) {
239              if (lscp_parser_test(&tok, "Alsa")) {                          // Getting informations about a specific MIDI input driver parameter.
240                  if (lscp_parser_test(&tok, "active")) {                          // GET MIDI_INPUT_DRIVER_PARAMETER INFO <midi-input-type> <param>
241                      pszResult = "DESCRIPTION: 'ALSA Sequencer device active state'\r\n"                          if (lscp_parser_test(&tok, "Alsa")) {
242                                  "TYPE: BOOL\r\n"                                  if (lscp_parser_test(&tok, "active")) {
243                                  "MANDATORY: TRUE\r\n"                                          pszResult = "DESCRIPTION: 'ALSA Sequencer device active state'\r\n"
244                                  "FIX: TRUE\r\n"                                                                  "TYPE: BOOL\r\n"
245                                  "MULTIPLICITY: FALSE\r\n"                                                                  "MANDATORY: TRUE\r\n"
246                                  "DEPENDS: channels,ports\r\n"                                                                  "FIX: TRUE\r\n"
247                                  "DEFAULT: TRUE\r\n"                                                                  "MULTIPLICITY: FALSE\r\n"
248                                  "RANGE_MIN: FALSE\r\n"                                                                  "DEPENDS: channels,ports\r\n"
249                                  "RANGE_MAX: TRUE\r\n"                                                                  "DEFAULT: TRUE\r\n"
250                                  "POSSIBILITIES: FALSE,TRUE\r\n"                                                                  "RANGE_MIN: FALSE\r\n"
251                                  ".\r\n";                                                                  "RANGE_MAX: TRUE\r\n"
252                  }                                                                  "POSSIBILITIES: FALSE,TRUE\r\n"
253                  else if (lscp_parser_test(&tok, "ports")) {                                                                  ".\r\n";
254                      pszResult = "DESCRIPTION: 'Number of ALSA Sequencer ports'\r\n"                                  }
255                                  "TYPE: INT\r\n"                                  else if (lscp_parser_test(&tok, "ports")) {
256                                  "MANDATORY: FALSE\r\n"                                          pszResult = "DESCRIPTION: 'Number of ALSA Sequencer ports'\r\n"
257                                  "FIX: FALSE\r\n"                                                                  "TYPE: INT\r\n"
258                                  "MULTIPLICITY: FALSE\r\n"                                                                  "MANDATORY: FALSE\r\n"
259                                  "DEFAULT: 1\r\n"                                                                  "FIX: FALSE\r\n"
260                                  "RANGE_MIN: 1\r\n"                                                                  "MULTIPLICITY: FALSE\r\n"
261                                  "RANGE_MAX: 4\r\n"                                                                  "DEFAULT: 1\r\n"
262                                  ".\r\n";                                                                  "RANGE_MIN: 1\r\n"
263                  }                                                                  "RANGE_MAX: 4\r\n"
264                  else ret = LSCP_FAILED;                                                                  ".\r\n";
265              }                                  }
266              else ret = LSCP_FAILED;                                  else ret = LSCP_FAILED;
267          }                          }
268          else if (lscp_parser_test2(&tok, "AUDIO_OUTPUT_DEVICE", "INFO")) {                          else ret = LSCP_FAILED;
269              // Getting informations about a specific audio output device.                  }
270              // GET AUDIO_OUTPUT_DEVICE INFO <audio-device-id>                  else if (lscp_parser_test2(&tok, "AUDIO_OUTPUT_DEVICE", "INFO")) {
271              if (lscp_parser_nextint(&tok) < iAudioDevice) {                          // Getting informations about a specific audio output device.
272                  pszResult = "driver: Alsa\r\n"                          // GET AUDIO_OUTPUT_DEVICE INFO <audio-device-id>
273                              "active: TRUE\r\n"                          if (lscp_parser_nextint(&tok) < iAudioDevice) {
274                              "channels: 2\r\n"                                  pszResult = "driver: Alsa\r\n"
275                              "samplerate: 44100\r\n"                                                          "active: TRUE\r\n"
276                              ".\r\n";                                                          "channels: 2\r\n"
277              }                                                          "samplerate: 44100\r\n"
278              else ret = LSCP_FAILED;                                                          ".\r\n";
279          }                          }
280          else if (lscp_parser_test2(&tok, "MIDI_INPUT_DEVICE", "INFO")) {                          else ret = LSCP_FAILED;
281              // Getting informations about a specific MIDI input device.                  }
282              // GET MIDI_INPUT_DEVICE INFO <midi-device-id>                  else if (lscp_parser_test2(&tok, "MIDI_INPUT_DEVICE", "INFO")) {
283              if (lscp_parser_nextint(&tok) < iMidiDevice) {                          // Getting informations about a specific MIDI input device.
284                  pszResult = "driver: Alsa\r\n"                          // GET MIDI_INPUT_DEVICE INFO <midi-device-id>
285                              "active: TRUE\r\n"                          if (lscp_parser_nextint(&tok) < iMidiDevice) {
286                              "channels: 16\r\n"                                  pszResult = "driver: Alsa\r\n"
287                              "ports: 1\r\n"                                                          "active: TRUE\r\n"
288                              ".\r\n";                                                          "channels: 16\r\n"
289              }                                                          "ports: 1\r\n"
290              else ret = LSCP_FAILED;                                                          ".\r\n";
291          }                          }
292          else if (lscp_parser_test2(&tok, "AUDIO_OUTPUT_CHANNEL", "INFO")) {                          else ret = LSCP_FAILED;
293              // Getting informations about an audio channel.                  }
294              // GET AUDIO_OUTPUT_CHANNEL INFO <audio-device-id> <audio-channel>                  else if (lscp_parser_test2(&tok, "AUDIO_OUTPUT_CHANNEL", "INFO")) {
295              if (lscp_parser_nextint(&tok) < iAudioDevice) {                          // Getting informations about an audio channel.
296                  pszResult = "name: DummyMonitor\r\n"                          // GET AUDIO_OUTPUT_CHANNEL INFO <audio-device-id> <audio-channel>
297                              "is_mix_channel: FALSE\r\n"                          if (lscp_parser_nextint(&tok) < iAudioDevice) {
298                              "mix_channel_destination: 0\r\n"                                  pszResult = "name: DummyMonitor\r\n"
299                              ".\r\n";                                                          "is_mix_channel: FALSE\r\n"
300              }                                                          "mix_channel_destination: 0\r\n"
301              else ret = LSCP_FAILED;                                                          ".\r\n";
302          }                          }
303          else if (lscp_parser_test2(&tok, "MIDI_INPUT_PORT", "INFO")) {                          else ret = LSCP_FAILED;
304              // Getting informations about a MIDI port.                  }
305              // GET MIDI_INPUT_PORT INFO <midi-device-id> <midi-port>                  else if (lscp_parser_test2(&tok, "MIDI_INPUT_PORT", "INFO")) {
306              if (lscp_parser_nextint(&tok) < iMidiDevice) {                          // Getting informations about a MIDI port.
307                  pszResult = "name: DummyKeyboard\r\n"                          // GET MIDI_INPUT_PORT INFO <midi-device-id> <midi-port>
308                              "alsa_seq_bindings: '64:0'\r\n"                          if (lscp_parser_nextint(&tok) < iMidiDevice) {
309                              ".\r\n";                                  pszResult = "name: DummyKeyboard\r\n"
310              }                                                          "alsa_seq_bindings: '64:0'\r\n"
311              else ret = LSCP_FAILED;                                                          ".\r\n";
312          }                          }
313          else if (lscp_parser_test2(&tok, "AUDIO_OUTPUT_CHANNEL_PARAMETER", "INFO")) {                          else ret = LSCP_FAILED;
314              // Getting informations about specific audio channel parameter.                  }
315              // GET AUDIO_OUTPUT_CHANNEL_PARAMETER INFO <audio-device-id> <audio-channel> <param>                  else if (lscp_parser_test2(&tok, "AUDIO_OUTPUT_CHANNEL_PARAMETER", "INFO")) {
316              if (lscp_parser_nextint(&tok) < iAudioDevice) {                          // Getting informations about specific audio channel parameter.
317                  lscp_parser_nextint(&tok);                          // GET AUDIO_OUTPUT_CHANNEL_PARAMETER INFO <audio-device-id> <audio-channel> <param>
318                  if (lscp_parser_test(&tok, "is_mix_channel")) {                          if (lscp_parser_nextint(&tok) < iAudioDevice) {
319                      pszResult = "DESCRIPTION: 'Whether this is an audio mix channel'\r\n"                                  lscp_parser_nextint(&tok);
320                                  "TYPE: BOOL\r\n"                                  if (lscp_parser_test(&tok, "is_mix_channel")) {
321                                  "MANDATORY: TRUE\r\n"                                          pszResult = "DESCRIPTION: 'Whether this is an audio mix channel'\r\n"
322                                  "FIX: FALSE\r\n"                                                                  "TYPE: BOOL\r\n"
323                                  "MULTIPLICITY: FALSE\r\n"                                                                  "MANDATORY: TRUE\r\n"
324                                  "POSSIBILITIES: FALSE,TRUE\r\n"                                                                  "FIX: FALSE\r\n"
325                                  ".\r\n";                                                                  "MULTIPLICITY: FALSE\r\n"
326                  }                                                                  "POSSIBILITIES: FALSE,TRUE\r\n"
327                  else if (lscp_parser_test(&tok, "mix_channel_destination")) {                                                                  ".\r\n";
328                      pszResult = "DESCRIPTION: 'Audio mix channel destination'\r\n"                                  }
329                                  "TYPE: INT\r\n"                                  else if (lscp_parser_test(&tok, "mix_channel_destination")) {
330                                  "MANDATORY: TRUE\r\n"                                          pszResult = "DESCRIPTION: 'Audio mix channel destination'\r\n"
331                                  "FIX: FALSE\r\n"                                                                  "TYPE: INT\r\n"
332                                  "MULTIPLICITY: TRUE\r\n"                                                                  "MANDATORY: TRUE\r\n"
333                                  "POSSIBILITIES: 0,1\r\n"                                                                  "FIX: FALSE\r\n"
334                                  ".\r\n";                                                                  "MULTIPLICITY: TRUE\r\n"
335                  }                                                                  "POSSIBILITIES: 0,1\r\n"
336                  else ret = LSCP_FAILED;                                                                  ".\r\n";
337              }                                  }
338              else ret = LSCP_FAILED;                                  else ret = LSCP_FAILED;
339          }                          }
340          else if (lscp_parser_test2(&tok, "MIDI_INPUT_PORT_PARAMETER", "INFO")) {                          else ret = LSCP_FAILED;
341              // Getting informations about specific MIDI port parameter.                  }
342              // GET MIDI_INPUT_PORT_PARAMETER INFO <midi-device-id> <midi-port> <param>                  else if (lscp_parser_test2(&tok, "MIDI_INPUT_PORT_PARAMETER", "INFO")) {
343              if (lscp_parser_nextint(&tok) < iMidiDevice) {                          // Getting informations about specific MIDI port parameter.
344                  lscp_parser_nextint(&tok);                          // GET MIDI_INPUT_PORT_PARAMETER INFO <midi-device-id> <midi-port> <param>
345                  if (lscp_parser_test(&tok, "alsa_seq_bindings")) {                          if (lscp_parser_nextint(&tok) < iMidiDevice) {
346                      pszResult = "DESCRIPTION: 'Alsa sequencer port bindings'\r\n"                                  lscp_parser_nextint(&tok);
347                                  "TYPE: STRING\r\n"                                  if (lscp_parser_test(&tok, "alsa_seq_bindings")) {
348                                  "MANDATORY: TRUE\r\n"                                          pszResult = "DESCRIPTION: 'Alsa sequencer port bindings'\r\n"
349                                  "FIX: FALSE\r\n"                                                                  "TYPE: STRING\r\n"
350                                  "MULTIPLICITY: TRUE\r\n"                                                                  "MANDATORY: TRUE\r\n"
351                                  "POSSIBILITIES: '64:0','68:0','68:1'\r\n"                                                                  "FIX: FALSE\r\n"
352                                  ".\r\n";                                                                  "MULTIPLICITY: TRUE\r\n"
353                  }                                                                  "POSSIBILITIES: '64:0','68:0','68:1'\r\n"
354                  else ret = LSCP_FAILED;                                                                  ".\r\n";
355              }                                  }
356              else ret = LSCP_FAILED;                                  else ret = LSCP_FAILED;
357          }                          }
358          else if (lscp_parser_test(&tok, "AUDIO_OUTPUT_DEVICES")) {                          else ret = LSCP_FAILED;
359              // Getting all created audio output device count.                  }
360              // GET AUDIO_OUTPUT_DEVICES                  else if (lscp_parser_test(&tok, "AUDIO_OUTPUT_DEVICES")) {
361              sprintf(szTemp, "%d\r\n", iAudioDevice);                          // Getting all created audio output device count.
362              pszResult = szTemp;                          // GET AUDIO_OUTPUT_DEVICES
363          }                          sprintf(szTemp, "%d\r\n", iAudioDevice);
364          else if (lscp_parser_test(&tok, "MIDI_INPUT_DEVICES")) {                          pszResult = szTemp;
365              // Getting all created MID input device count.                  }
366              // GET MIDI_INPUT_DEVICES                  else if (lscp_parser_test(&tok, "MIDI_INPUT_DEVICES")) {
367              sprintf(szTemp, "%d\r\n", iMidiDevice);                          // Getting all created MID input device count.
368              pszResult = szTemp;                          // GET MIDI_INPUT_DEVICES
369          }                          sprintf(szTemp, "%d\r\n", iMidiDevice);
370          else if (lscp_parser_test(&tok, "AVAILABLE_ENGINES")) {                          pszResult = szTemp;
371              // Getting all available engine count:                  }
372              // GET AVAILABLE_ENGINES                  else if (lscp_parser_test(&tok, "AVAILABLE_ENGINES")) {
373              pszResult = "3\r\n";                          // Getting all available engine count:
374          }                          // GET AVAILABLE_ENGINES
375          else if (lscp_parser_test2(&tok, "SERVER", "INFO")) {                          pszResult = "3\r\n";
376              // Getting information about the server.                  }
377              // GET SERVER INFO                  else if (lscp_parser_test2(&tok, "SERVER", "INFO")) {
378              sprintf(szTemp, "DESCRIPTION: example_server (%s) %s\r\n"                          // Getting information about the server.
379                  "VERSION: %s\r\n.\r\n", lscp_server_package(),                          // GET SERVER INFO
380                  lscp_server_build(), lscp_server_version());                          sprintf(szTemp, "DESCRIPTION: example_server (%s) %s\r\n"
381              pszResult = szTemp;                                  "VERSION: %s\r\n.\r\n", lscp_server_package(),
382          }                                  lscp_server_build(), lscp_server_version());
383          else if (lscp_parser_test2(&tok, "ENGINE", "INFO")) {                          pszResult = szTemp;
384              // Getting information about an engine.                  }
385              // GET ENGINE INFO <engine-name>                  else if (lscp_parser_test2(&tok, "ENGINE", "INFO")) {
386              if (lscp_parser_test(&tok, "GigEngine")) {                          // Getting information about an engine.
387                  pszResult = "DESCRIPTION: GigaSampler Engine\r\n"                          // GET ENGINE INFO <engine-name>
388                              "VERSION: 0.3\r\n"                          if (lscp_parser_test(&tok, "GigEngine")) {
389                              ".\r\n";                                  pszResult = "DESCRIPTION: GigaSampler Engine\r\n"
390              }                                                          "VERSION: 0.3\r\n"
391              else if (lscp_parser_test(&tok, "DLSEngine")) {                                                          ".\r\n";
392                  pszResult = "DESCRIPTION: 'DLS Generic Engine'\r\n"                          }
393                              "VERSION: 0.2\r\n"                          else if (lscp_parser_test(&tok, "DLSEngine")) {
394                              ".\r\n";                                  pszResult = "DESCRIPTION: 'DLS Generic Engine'\r\n"
395              }                                                          "VERSION: 0.2\r\n"
396              else if (lscp_parser_test(&tok, "AkaiEngine")) {                                                          ".\r\n";
397                  pszResult = "DESCRIPTION: Akai Sampler Engine\r\n"                          }
398                              "VERSION: 0.1\r\n"                          else if (lscp_parser_test(&tok, "AkaiEngine")) {
399                              ".\r\n";                                  pszResult = "DESCRIPTION: Akai Sampler Engine\r\n"
400              }                                                          "VERSION: 0.1\r\n"
401              else ret = LSCP_FAILED;                                                          ".\r\n";
402          }                          }
403          else if (lscp_parser_test(&tok, "TOTAL_VOICE_COUNT")) {                          else ret = LSCP_FAILED;
404              // Current number of active voices:                  }
405              // GET TOTAL_VOICE_COUNT                  else if (lscp_parser_test(&tok, "TOTAL_VOICE_COUNT")) {
406              sprintf(szTemp, "%d\r\n", rand() % 100);                          // Current number of active voices:
407              pszResult = szTemp;                          // GET TOTAL_VOICE_COUNT
408          }                          sprintf(szTemp, "%d\r\n", rand() % 100);
409          else if (lscp_parser_test(&tok, "TOTAL_VOICE_COUNT_MAX")) {                          pszResult = szTemp;
410              // Maximum amount of active voices:                  }
411              // GET TOTAL_VOICE_COUNT_MAX                  else if (lscp_parser_test(&tok, "TOTAL_VOICE_COUNT_MAX")) {
412              sprintf(szTemp, "%d\r\n", rand() % 100);                          // Maximum amount of active voices:
413              pszResult = szTemp;                          // GET TOTAL_VOICE_COUNT_MAX
414          }                          sprintf(szTemp, "%d\r\n", rand() % 100);
415          else if (lscp_parser_test(&tok, "MIDI_INSTRUMENTS")) {                          pszResult = szTemp;
416              // Get the total count of MIDI instrument map entries:                  }
417              // GET MIDI_INSTRUMENTS                  else if (lscp_parser_test(&tok, "VOLUME")) {
418              sprintf(szTemp, "%d\r\n", iMidiInstruments);                          // Get global volume attenuation:
419              pszResult = szTemp;                          // GET VOLUME
420          }                          sprintf(szTemp, "%g\r\n", fVolume);
421          if (lscp_parser_test2(&tok, "MIDI_INSTRUMENT", "INFO")) {                          pszResult = szTemp;
422              // Getting information about a MIDI instrument map entry:                  }
423              // GET MIDI_INSTRUMENT INFO <midi-bank-msb> <midi-bank-lsb> <midi-prog>                  else if (lscp_parser_test(&tok, "MIDI_INSTRUMENTS")) {
424              pszResult = "NAME: DummyName\r\n"                          // Get the total count of MIDI instrument map entries:
425                          "ENGINE_NAME: DummyEngine\r\n"                          // GET MIDI_INSTRUMENTS
426                          "INSTRUMENT_FILE: DummyInstrument.gig\r\n"                          sprintf(szTemp, "%d\r\n", iMidiInstruments);
427                          "INSTRUMENT_NR: 0\r\n"                          pszResult = szTemp;
428                          "INSTRUMENT_NAME: Dummy Instrument\r\n"                  }
429                          "LOAD_MODE: ON_DEMAND\r\n"                  else if (lscp_parser_test(&tok, "MIDI_INSTRUMENT_MAPS")) {
430                          "VOLUME: 0.5\r\n"                          // Get the total count of MIDI instrument maps:
431                          ".\r\n";                          // GET MIDI_INSTRUMENT_MAPS
432          }                          sprintf(szTemp, "%d\r\n", iMidiMaps);
433          else ret = LSCP_FAILED;                          pszResult = szTemp;
434      }                  }
435      else if (lscp_parser_test(&tok, "LIST")) {                  else if (lscp_parser_test2(&tok, "MIDI_INSTRUMENT_MAP", "INFO")) {
436          if (lscp_parser_test(&tok, "CHANNELS")) {                          // Getting information about a MIDI instrument map entry:
437              // Getting all created sampler channel list.                          // GET MIDI_INSTRUMENT_MAP INFO <midi-map>
438              // LIST CHANNELS                          strcpy(szTemp, "NAME: ");
439              if (iSamplerChannel > 0) {                          switch (lscp_parser_nextint(&tok)) {
440                  strcpy(szTemp, "0");                          case 0:
441                  for (i = 1; i < iSamplerChannel && strlen(szTemp) < sizeof(szTemp) - 8; i++)                                  strcat(szTemp, "Chromatic\r\n");
442                      sprintf(szTemp + strlen(szTemp), ",%d", i);                                  break;
443                  strcat(szTemp, "\r\n");                          case 1:
444                  pszResult = szTemp;                                  strcat(szTemp, "Drum Kits\r\n");
445              }                                  break;
446              else ret = LSCP_FAILED;                          }
447          }                          strcat(szTemp, ".\r\n");
448          else if (lscp_parser_test(&tok, "AVAILABLE_ENGINES")) {                          pszResult = szTemp;
449              // Getting all available engines:                  }
450              // LIST AVAILABLE_ENGINES                  else if (lscp_parser_test2(&tok, "MIDI_INSTRUMENT", "INFO")) {
451              pszResult = "GigEngine,DLSEngine,AkaiEngine\r\n";                          // Getting information about a MIDI instrument map entry:
452          }                          // GET MIDI_INSTRUMENT INFO <midi-map> <midi-bank> <midi-prog>
453          else if (lscp_parser_test(&tok, "AVAILABLE_AUDIO_OUTPUT_DRIVERS")) {                          pszResult = "NAME: DummyName\r\n"
454              // Getting all available audio output drivers.                                                  "ENGINE_NAME: DummyEngine\r\n"
455              // LIST AVAILABLE_AUDIO_OUTPUT_DRIVERS                                                  "INSTRUMENT_FILE: DummyInstrument.gig\r\n"
456              pszResult = "ALSA,JACK\r\n";                                                  "INSTRUMENT_NR: 0\r\n"
457          }                                                  "INSTRUMENT_NAME: Dummy Instrument\r\n"
458          else if (lscp_parser_test(&tok, "AVAILABLE_MIDI_INPUT_DRIVERS")) {                                                  "LOAD_MODE: ON_DEMAND\r\n"
459              // Getting all available MIDI input drivers.                                                  "VOLUME: 0.5\r\n"
460              // LIST AVAILABLE_MIDI_INPUT_DRIVERS                                                  ".\r\n";
461              pszResult = "ALSA\r\n";                  }
462          }                  else ret = LSCP_FAILED;
463          else if (lscp_parser_test(&tok, "AUDIO_OUTPUT_DEVICES")) {          }
464              // Getting all created audio output device list.          else if (lscp_parser_test(&tok, "LIST")) {
465              // LIST AUDIO_OUTPUT_DEVICES                  if (lscp_parser_test(&tok, "CHANNELS")) {
466              if (iAudioDevice > 0) {                          // Getting all created sampler channel list.
467                  strcpy(szTemp, "0");                          // LIST CHANNELS
468                  for (i = 1; i < iAudioDevice && strlen(szTemp) < sizeof(szTemp) - 8; i++)                          szTemp[0] = (char) 0;
469                      sprintf(szTemp + strlen(szTemp), ",%d", i);                          for (i = 0; i < iSamplerChannel && strlen(szTemp) < sizeof(szTemp) - 8; i++) {
470                  strcat(szTemp, "\r\n");                                  if (i > 0)
471                  pszResult = szTemp;                                          strcat(szTemp, ",");
472              }                                  sprintf(szTemp + strlen(szTemp), "%d", i);
473              else ret = LSCP_FAILED;                          }
474          }                          strcat(szTemp, "\r\n");
475          else if (lscp_parser_test(&tok, "MIDI_INPUT_DEVICES")) {                          pszResult = szTemp;
476              // Getting all created MID input device list.                  }
477              // LIST MIDI_INPUT_DEVICES                  else if (lscp_parser_test(&tok, "AVAILABLE_ENGINES")) {
478              if (iMidiDevice > 0) {                          // Getting all available engines:
479                  strcpy(szTemp, "0");                          // LIST AVAILABLE_ENGINES
480                  for (i = 1; i < iMidiDevice && strlen(szTemp) < sizeof(szTemp) - 8; i++)                          pszResult = "GigEngine,DLSEngine,AkaiEngine\r\n";
481                      sprintf(szTemp + strlen(szTemp), ",%d", i);                  }
482                  strcat(szTemp, "\r\n");                  else if (lscp_parser_test(&tok, "AVAILABLE_AUDIO_OUTPUT_DRIVERS")) {
483                  pszResult = szTemp;                          // Getting all available audio output drivers.
484              }                          // LIST AVAILABLE_AUDIO_OUTPUT_DRIVERS
485              else ret = LSCP_FAILED;                          pszResult = "ALSA,JACK\r\n";
486          }                  }
487          else if (lscp_parser_test(&tok, "MIDI_INSTRUMENTS")) {                  else if (lscp_parser_test(&tok, "AVAILABLE_MIDI_INPUT_DRIVERS")) {
488              // Getting indeces of all MIDI instrument map entries:                          // Getting all available MIDI input drivers.
489              // LIST MIDI_INSTRUMENTS                          // LIST AVAILABLE_MIDI_INPUT_DRIVERS
490              if (iMidiInstruments > 0) {                          pszResult = "ALSA\r\n";
491                  strcpy(szTemp, "{0,0,0}");                  }
492                  for (i = 1; i < iMidiInstruments && strlen(szTemp) < sizeof(szTemp) - 16; i++)                  else if (lscp_parser_test(&tok, "AUDIO_OUTPUT_DEVICES")) {
493                      sprintf(szTemp + strlen(szTemp), ",{0,%d,%d}", i / 128, i % 128);                          // Getting all created audio output device list.
494                  strcat(szTemp, "\r\n");                          // LIST AUDIO_OUTPUT_DEVICES
495                  pszResult = szTemp;                          szTemp[0] = (char) 0;
496              }                          for (i = 0; i < iAudioDevice && strlen(szTemp) < sizeof(szTemp) - 8; i++) {
497              else ret = LSCP_FAILED;                                  if (i > 0)
498          }                                          strcat(szTemp, ",");
499          else ret = LSCP_FAILED;                                  sprintf(szTemp + strlen(szTemp), "%d", i);
500      }                          }
501      else if (lscp_parser_test(&tok, "SET")) {                          strcat(szTemp, "\r\n");
502          if (lscp_parser_test(&tok, "CHANNEL")) {                          pszResult = szTemp;
503              if (lscp_parser_test(&tok, "VOLUME")) {                  }
504                  // Setting channel volume:                  else if (lscp_parser_test(&tok, "MIDI_INPUT_DEVICES")) {
505                  // SET CHANNEL VOLUME <sampler-channel> <volume>                          // Getting all created MID input device list.
506              }                          // LIST MIDI_INPUT_DEVICES
507              else if (lscp_parser_test(&tok, "MUTE")) {                          szTemp[0] = (char) 0;
508                  // Muting a sampler channel:                          for (i = 0; i < iMidiDevice && strlen(szTemp) < sizeof(szTemp) - 8; i++) {
509                  // SET CHANNEL MUTE <sampler-channel> <mute>                                  if (i > 0)
510              }                                          strcat(szTemp, ",");
511              else if (lscp_parser_test(&tok, "SOLO")) {                                  sprintf(szTemp + strlen(szTemp), "%d", i);
512                  // Soloing a sampler channel:                          }
513                  // SET CHANNEL SOLO <sampler-channel> <solo>                          strcat(szTemp, "\r\n");
514              }                          pszResult = szTemp;
515              else if (lscp_parser_test(&tok, "AUDIO_OUTPUT_TYPE")) {                  }
516                  // Setting audio output type:                  else if (lscp_parser_test(&tok, "MIDI_INSTRUMENTS")) {
517                  // SET CHANNEL AUDIO_OUTPUT_TYPE <sampler-channel> <audio-output-type>                          // Getting indeces of all MIDI instrument map entries:
518              }                          // LIST MIDI_INSTRUMENTS
519              else if (lscp_parser_test(&tok, "AUDIO_OUTPUT_DEVICE")) {                          szTemp[0] = (char) 0;
520                  // Setting audio output device:                          for (i = 0; i < iMidiInstruments && strlen(szTemp) < sizeof(szTemp) - 16; i++) {
521                  // SET CHANNEL AUDIO_OUTPUT_DEVICE <sampler-channel> <device-id>                                  if (i > 0)
522              }                                          strcat(szTemp, ",");
523              else if (lscp_parser_test(&tok, "AUDIO_OUTPUT_CHANNEL")) {                                  sprintf(szTemp + strlen(szTemp), "{0,%d,%d}", i / 128, i % 128);
524                  // Setting audio output channel:                          }
525                  // SET CHANNEL AUDIO_OUTPUT_CHANNEL <sampler-channel> <audio-in> <audio-out>                          strcat(szTemp, "\r\n");
526              }                          pszResult = szTemp;
527              else if (lscp_parser_test(&tok, "MIDI_INPUT_TYPE")) {                  }
528                  // Setting MIDI input type:                  else if (lscp_parser_test(&tok, "MIDI_INSTRUMENT_MAPS")) {
529                  // SET CHANNEL MIDI_INPUT_TYPE <sampler-channel> <midi-input-type>                          // Getting indeces of all MIDI instrument map entries:
530              }                          // LIST MIDI_INSTRUMENT_MAPS
531              else if (lscp_parser_test(&tok, "MIDI_INPUT_DEVICE")) {                          szTemp[0] = (char) 0;
532                  // Setting MIDI input device:                          for (i = 0; i < iMidiMaps && strlen(szTemp) < sizeof(szTemp) - 8; i++) {
533                  // SET CHANNEL MIDI_INPUT_DEVICE <sampler-channel> <device-id>                                  if (i > 0)
534              }                                          strcat(szTemp, ",");
535              else if (lscp_parser_test(&tok, "MIDI_INPUT_PORT")) {                                  sprintf(szTemp + strlen(szTemp), "%d", i);
536                  // Setting MIDI input port:                          }
537                  // SET CHANNEL MIDI_INPUT_PORT <sampler-channel> <midi-input-port>                          strcat(szTemp, "\r\n");
538              }                          pszResult = szTemp;
539              else if (lscp_parser_test(&tok, "MIDI_INPUT_CHANNEL")) {                  }
540                  // Setting MIDI input channel:                  else ret = LSCP_FAILED;
541                  // SET CHANNEL MIDI_INPUT_CHANNEL <sampler-channel> <midi-input-chan>          }
542              }          else if (lscp_parser_test(&tok, "SET")) {
543              else ret = LSCP_FAILED;                  if (lscp_parser_test(&tok, "CHANNEL")) {
544          }                          if (lscp_parser_test(&tok, "VOLUME")) {
545          else ret = LSCP_FAILED;                                  // Setting channel volume:
546      }                                  // SET CHANNEL VOLUME <sampler-channel> <volume>
547      else if (lscp_parser_test(&tok, "LOAD")) {                          }
548          if (lscp_parser_test(&tok, "ENGINE")) {                          else if (lscp_parser_test(&tok, "MUTE")) {
549              // Loading a sampler engine:                                  // Muting a sampler channel:
550              // LOAD ENGINE <engine-name> <sampler-channel>                                  // SET CHANNEL MUTE <sampler-channel> <mute>
551          }                          }
552          else if (lscp_parser_test(&tok, "INSTRUMENT")) {                          else if (lscp_parser_test(&tok, "SOLO")) {
553              // Loading an instrument:                                  // Soloing a sampler channel:
554              // LOAD INSTRUMENT [NON_MODAL] <filename> <instr-index> <sampler-channel>                                  // SET CHANNEL SOLO <sampler-channel> <solo>
555          }                          }
556          else ret = LSCP_FAILED;                          else if (lscp_parser_test(&tok, "AUDIO_OUTPUT_TYPE")) {
557      }                                  // Setting audio output type:
558      else if (lscp_parser_test2(&tok, "ADD", "CHANNEL")) {                                  // SET CHANNEL AUDIO_OUTPUT_TYPE <sampler-channel> <audio-output-type>
559          // Adding a new sampler channel:                          }
560          // ADD CHANNEL                          else if (lscp_parser_test(&tok, "AUDIO_OUTPUT_DEVICE")) {
561          if (iSamplerChannel < 16) {                                  // Setting audio output device:
562              sprintf(szTemp, "OK[%d]\r\n", iSamplerChannel++);                                  // SET CHANNEL AUDIO_OUTPUT_DEVICE <sampler-channel> <device-id>
563              pszResult = szTemp;                          }
564          } else {                          else if (lscp_parser_test(&tok, "AUDIO_OUTPUT_CHANNEL")) {
565              iSamplerChannel = 0;                                  // Setting audio output channel:
566              ret = LSCP_FAILED;                                  // SET CHANNEL AUDIO_OUTPUT_CHANNEL <sampler-channel> <audio-in> <audio-out>
567          }                          }
568      }                          else if (lscp_parser_test(&tok, "MIDI_INPUT_TYPE")) {
569      else if (lscp_parser_test2(&tok, "REMOVE", "CHANNEL")) {                                  // Setting MIDI input type:
570          // Removing a sampler channel:                                  // SET CHANNEL MIDI_INPUT_TYPE <sampler-channel> <midi-input-type>
571          // REMOVE CHANNEL <sampler-channel>                          }
572          if (lscp_parser_nextint(&tok) < iSamplerChannel)                          else if (lscp_parser_test(&tok, "MIDI_INPUT_DEVICE")) {
573              iSamplerChannel--;                                  // Setting MIDI input device:
574          else                                  // SET CHANNEL MIDI_INPUT_DEVICE <sampler-channel> <device-id>
575              ret = LSCP_FAILED;                          }
576      }                          else if (lscp_parser_test(&tok, "MIDI_INPUT_PORT")) {
577      else if (lscp_parser_test(&tok, "RESET")) {                                  // Setting MIDI input port:
578          if (lscp_parser_test(&tok, "CHANNEL")) {                                  // SET CHANNEL MIDI_INPUT_PORT <sampler-channel> <midi-input-port>
579              // Resetting a sampler channel:                          }
580              // RESET CHANNEL <sampler-channel>                          else if (lscp_parser_test(&tok, "MIDI_INPUT_CHANNEL")) {
581              if (lscp_parser_nextint(&tok) > iSamplerChannel)                                  // Setting MIDI input channel:
582                  ret = LSCP_FAILED;                                  // SET CHANNEL MIDI_INPUT_CHANNEL <sampler-channel> <midi-input-chan>
583          } else {                          }
584              // Reset sampler:                          else if (lscp_parser_test(&tok, "MIDI_INSTRUMENT_MAP")) {
585              // RESET                                  // Setting MIDI instrument mapl:
586              iSamplerChannel = 0;                                  // SET CHANNEL MIDI_INSTRUMENT_MAP <sampler-channel> <midi-map>
587              iAudioDevice = 0;                          }
588              iMidiDevice = 0;                          else ret = LSCP_FAILED;
589          }                  }
590      }                  else if (lscp_parser_test(&tok, "VOLUME")) {
591      else if (lscp_parser_test(&tok, "CREATE")) {                          // Setting global volume attenuation:
592          if (lscp_parser_test(&tok, "AUDIO_OUTPUT_DEVICE")) {                          // SET VOLUME <volume>
593              // Creating an audio output device.                          fVolume = lscp_parser_nextnum(&tok);
594              // CREATE AUDIO_OUTPUT_DEVICE <audio-output-driver> [<params>]                  }
595              if (iAudioDevice < 8) {                  else if (lscp_parser_test2(&tok, "MIDI_INSTRUMENT_MAP", "NAME")) {
596                  sprintf(szTemp, "OK[%d]\r\n", iAudioDevice++);                          // Setting MIDI instrument map name:
597                  pszResult = szTemp;                          // SET MIDI_INSTRUMENT_MAP NAME <midi-map> <map-name>
598              } else {                  }
599                  iAudioDevice = 0;                  else ret = LSCP_FAILED;
600                  ret = LSCP_FAILED;          }
601              }          else if (lscp_parser_test(&tok, "LOAD")) {
602          }                  if (lscp_parser_test(&tok, "ENGINE")) {
603          else if (lscp_parser_test(&tok, "MIDI_INPUT_DEVICE")) {                          // Loading a sampler engine:
604              // Creating an MIDI input device.                          // LOAD ENGINE <engine-name> <sampler-channel>
605              // CREATE MIDI_INPUT_DEVICE <midi-input-driver> [<params>]                  }
606              if (iMidiDevice < 8) {                  else if (lscp_parser_test(&tok, "INSTRUMENT")) {
607                  sprintf(szTemp, "OK[%d]\r\n", iMidiDevice++);                          // Loading an instrument:
608                  pszResult = szTemp;                          // LOAD INSTRUMENT [NON_MODAL] <filename> <instr-index> <sampler-channel>
609              } else {                  }
610                  iMidiDevice = 0;                  else ret = LSCP_FAILED;
611                  ret = LSCP_FAILED;          }
612              }          else if (lscp_parser_test(&tok, "ADD")) {
613          }                  if (lscp_parser_test(&tok, "CHANNEL")) {
614          else ret = LSCP_FAILED;                          // Adding a new sampler channel:
615      }                          // ADD CHANNEL
616      else if (lscp_parser_test(&tok, "DESTROY")) {                          if (iSamplerChannel < 16) {
617          if (lscp_parser_test(&tok, "AUDIO_OUTPUT_DEVICE")) {                                  sprintf(szTemp, "OK[%d]\r\n", iSamplerChannel++);
618              // Destroying an audio output device.                                  pszResult = szTemp;
619              // DESTROY AUDIO_OUTPUT_DEVICE <audio-device-id>                          } else {
620              if (lscp_parser_nextint(&tok) < iAudioDevice)                                  iSamplerChannel = 0;
621                  iAudioDevice--;                                  ret = LSCP_FAILED;
622              else                          }
623                  ret = LSCP_FAILED;                  }
624          }                  else if (lscp_parser_test(&tok, "MIDI_INSTRUMENT_MAP")) {
625          else if (lscp_parser_test(&tok, "MIDI_INPUT_DEVICE")) {                          // Adding a new MIDI instrument map:
626              // Destroying an MIDI intput device.                          // ADD MIDI_INSTRUMENT_MAP <map-name>
627              // DESTROY MIDI_INPUT_DEVICE <midi-device-id>                          if (iMidiMaps < 2) {
628              if (lscp_parser_nextint(&tok) < iMidiDevice)                                  sprintf(szTemp, "OK[%d]\r\n", iMidiMaps++);
629                  iMidiDevice--;                                  pszResult = szTemp;
630              else                          } else {
631                  ret = LSCP_FAILED;                                  iMidiMaps = 0;
632          }                                  ret = LSCP_FAILED;
633          else ret = LSCP_FAILED;                          }
634      }                  }
635      else if (lscp_parser_test2(&tok, "MAP", "MIDI_INSTRUMENT")) {          }
636          // Create or replace a MIDI instrumnet map entry:          else if (lscp_parser_test(&tok, "REMOVE")) {
637          // MAP MIDI_INSTRUMENT <midi-bank-msb> <midi-bank-lsb> <midi-prog>                  if (lscp_parser_test(&tok, "CHANNEL")) {
638          // <engine-name> <filename> <instr-index> <volume> <load-mode> [<name>]                          // Removing a sampler channel:
639          iMidiInstruments++;                          // REMOVE CHANNEL <sampler-channel>
640      }                          if (lscp_parser_nextint(&tok) >= 0)
641      else if (lscp_parser_test2(&tok, "UNMAP", "MIDI_INSTRUMENT")) {                                  iSamplerChannel--;
642          // Remove an entry from the MIDI instrument map:                          else
643          // UNMAP MIDI_INSTRUMENT <midi-bank-msb> <midi-bank-lsb> <midi-prog>                                  ret = LSCP_FAILED;
644          if (iMidiInstruments > 0)                  }
645              iMidiInstruments--;                  else if (lscp_parser_test(&tok, "MIDI_INSTRUMENT_MAP")) {
646          else                          // Removing a MIDI instrument map:
647              ret = LSCP_FAILED;                          // REMOVE MIDI_INSTRUMENT_MAP <midi-map>
648      }                          if (lscp_parser_nextint(&tok) >= 0)
649      else if (lscp_parser_test2(&tok, "CLEAR", "MIDI_INSTRUMENTS")) {                                  iMidiMaps--;
650          // Clear the MIDI instrumnet map:                          else
651          // CLEAR MIDI_INSTRUMENTS                                  ret = LSCP_FAILED;
652      }                  }
653      else if (lscp_parser_test(&tok, "SUBSCRIBE")) {          }
654          // Register frontend for receiving event notification messages:          else if (lscp_parser_test(&tok, "RESET")) {
655          // SUBSCRIBE <event>                  if (lscp_parser_test(&tok, "CHANNEL")) {
656          ret = lscp_server_subscribe(pConnect, lscp_event_from_text(lscp_parser_next(&tok)));                          // Resetting a sampler channel:
657      }                          // RESET CHANNEL <sampler-channel>
658      else if (lscp_parser_test(&tok, "UNSUBSCRIBE")) {                          if (lscp_parser_nextint(&tok) > iSamplerChannel)
659          // Deregister frontend for not receiving event notification messages anymore:                                  ret = LSCP_FAILED;
660          // UNSUBSCRIBE <event>                  } else {
661          ret = lscp_server_unsubscribe(pConnect, lscp_event_from_text(lscp_parser_next(&tok)));                          // Reset sampler:
662      }                          // RESET
663      else if (lscp_parser_test(&tok, "QUIT")) {                          iSamplerChannel = 0;
664          // Close client connection:                          iAudioDevice = 0;
665          // QUIT                          iMidiDevice = 0;
666          lscp_parser_free(&tok);                          iMidiMaps = 0;
667          return LSCP_FAILED; // Disconnect.                          iMidiInstruments = 0;
668      }                  }
669      else ret = LSCP_FAILED;          }
670            else if (lscp_parser_test(&tok, "CREATE")) {
671                    if (lscp_parser_test(&tok, "AUDIO_OUTPUT_DEVICE")) {
672                            // Creating an audio output device.
673                            // CREATE AUDIO_OUTPUT_DEVICE <audio-output-driver> [<params>]
674                            if (iAudioDevice < 8) {
675                                    sprintf(szTemp, "OK[%d]\r\n", iAudioDevice++);
676                                    pszResult = szTemp;
677                            } else {
678                                    iAudioDevice = 0;
679                                    ret = LSCP_FAILED;
680                            }
681                    }
682                    else if (lscp_parser_test(&tok, "MIDI_INPUT_DEVICE")) {
683                            // Creating an MIDI input device.
684                            // CREATE MIDI_INPUT_DEVICE <midi-input-driver> [<params>]
685                            if (iMidiDevice < 8) {
686                                    sprintf(szTemp, "OK[%d]\r\n", iMidiDevice++);
687                                    pszResult = szTemp;
688                            } else {
689                                    iMidiDevice = 0;
690                                    ret = LSCP_FAILED;
691                            }
692                    }
693                    else ret = LSCP_FAILED;
694            }
695            else if (lscp_parser_test(&tok, "DESTROY")) {
696                    if (lscp_parser_test(&tok, "AUDIO_OUTPUT_DEVICE")) {
697                            // Destroying an audio output device.
698                            // DESTROY AUDIO_OUTPUT_DEVICE <audio-device-id>
699                            if (lscp_parser_nextint(&tok) < iAudioDevice)
700                                    iAudioDevice--;
701                            else
702                                    ret = LSCP_FAILED;
703                    }
704                    else if (lscp_parser_test(&tok, "MIDI_INPUT_DEVICE")) {
705                            // Destroying an MIDI intput device.
706                            // DESTROY MIDI_INPUT_DEVICE <midi-device-id>
707                            if (lscp_parser_nextint(&tok) < iMidiDevice)
708                                    iMidiDevice--;
709                            else
710                                    ret = LSCP_FAILED;
711                    }
712                    else ret = LSCP_FAILED;
713            }
714            else if (lscp_parser_test2(&tok, "MAP", "MIDI_INSTRUMENT")) {
715                    // Create or replace a MIDI instrumnet map entry:
716                    // MAP MIDI_INSTRUMENT <midi-map> <midi-bank> <midi-prog>
717                    // <engine-name> <filename> <instr-index> <volume> <load-mode> [<name>]
718                    iMidiInstruments++;
719            }
720            else if (lscp_parser_test2(&tok, "UNMAP", "MIDI_INSTRUMENT")) {
721                    // Remove an entry from the MIDI instrument map:
722                    // UNMAP MIDI_INSTRUMENT <midi-map> <midi-bank> <midi-prog>
723                    if (iMidiInstruments > 0)
724                            iMidiInstruments--;
725                    else
726                            ret = LSCP_FAILED;
727            }
728            else if (lscp_parser_test2(&tok, "CLEAR", "MIDI_INSTRUMENTS")) {
729                    // Clear the MIDI instrumnet map:
730                    // CLEAR MIDI_INSTRUMENTS
731                    iMidiInstruments = 0;
732            }
733            else if (lscp_parser_test(&tok, "SUBSCRIBE")) {
734                    // Register frontend for receiving event notification messages:
735                    // SUBSCRIBE <event>
736                    ret = lscp_server_subscribe(pConnect, lscp_event_from_text(lscp_parser_next(&tok)));
737            }
738            else if (lscp_parser_test(&tok, "UNSUBSCRIBE")) {
739                    // Deregister frontend for not receiving event notification messages anymore:
740                    // UNSUBSCRIBE <event>
741                    ret = lscp_server_unsubscribe(pConnect, lscp_event_from_text(lscp_parser_next(&tok)));
742            }
743            else if (lscp_parser_test(&tok, "QUIT")) {
744                    // Close client connection:
745                    // QUIT
746                    lscp_parser_free(&tok);
747                    return LSCP_FAILED; // Disconnect.
748            }
749            else ret = LSCP_FAILED;
750    
751      lscp_parser_free(&tok);          lscp_parser_free(&tok);
752    
753      if (pszResult == NULL)          if (pszResult == NULL)
754          pszResult = (ret == LSCP_OK ? "OK\r\n" : "ERR:1:Failed\r\n");                  pszResult = (ret == LSCP_OK ? "OK\r\n" : "ERR:1:Failed\r\n");
755    
756      fprintf(stderr, "> %s", pszResult);          fprintf(stderr, "> %s", pszResult);
757    
758      return lscp_server_result(pConnect, pszResult, strlen(pszResult));          return lscp_server_result(pConnect, pszResult, strlen(pszResult));
759  }  }
760    
761    
762  ////////////////////////////////////////////////////////////////////////  ////////////////////////////////////////////////////////////////////////
763    
764    
765  void server_usage (void)  void server_usage (void)
766  {  {
767      printf("\n  %s %s (Build: %s)\n", lscp_server_package(), lscp_server_version(), lscp_server_build());          printf("\n  %s %s (Build: %s)\n", lscp_server_package(), lscp_server_version(), lscp_server_build());
768    
769      fputs("\n  Available server commands: help, exit, quit, list", stdout);          fputs("\n  Available server commands: help, exit, quit, list", stdout);
770      fputs("\n  (all else are broadcast verbatim to subscribers)\n\n", stdout);          fputs("\n  (all else are broadcast verbatim to subscribers)\n\n", stdout);
771  }  }
772    
773  void server_prompt (void)  void server_prompt (void)
774  {  {
775      fputs("lscp_server> ", stdout);          fputs("lscp_server> ", stdout);
776  }  }
777    
778  int main (int argc, char *argv[] )  int main (int argc, char *argv[] )
779  {  {
780      lscp_server_t *pServer;          lscp_server_t *pServer;
781      char szLine[200];          char szLine[200];
782      int cchLine;          int cchLine;
783      lscp_connect_t *p;          lscp_connect_t *p;
784    
785  #if defined(WIN32)  #if defined(WIN32)
786      if (WSAStartup(MAKEWORD(1, 1), &_wsaData) != 0) {          if (WSAStartup(MAKEWORD(1, 1), &_wsaData) != 0) {
787          fprintf(stderr, "lscp_server: WSAStartup failed.\n");                  fprintf(stderr, "lscp_server: WSAStartup failed.\n");
788          return -1;                  return -1;
789      }          }
790  #endif  #endif
791    
792      srand(time(NULL));          srand(time(NULL));
793    
794      pServer = lscp_server_create(SERVER_PORT, server_callback, NULL);          pServer = lscp_server_create(SERVER_PORT, server_callback, NULL);
795      if (pServer == NULL)          if (pServer == NULL)
796          return -1;                  return -1;
797    
798      server_usage();          server_usage();
799      server_prompt();          server_prompt();
800    
801      while (fgets(szLine, sizeof(szLine), stdin)) {          while (fgets(szLine, sizeof(szLine), stdin)) {
802    
803          cchLine = strlen(szLine);                  cchLine = strlen(szLine);
804          while (cchLine > 0 && (szLine[cchLine - 1] == '\n' || szLine[cchLine - 1] == '\r'))                  while (cchLine > 0 && (szLine[cchLine - 1] == '\n' || szLine[cchLine - 1] == '\r'))
805              cchLine--;                          cchLine--;
806          szLine[cchLine] = '\0';                  szLine[cchLine] = '\0';
807    
808          if (strcmp(szLine, "exit") == 0 || strcmp(szLine, "quit") == 0)                  if (strcmp(szLine, "exit") == 0 || strcmp(szLine, "quit") == 0)
809              break;                          break;
810          else                  else
811          if (strcmp(szLine, "list") == 0) {                  if (strcmp(szLine, "list") == 0) {
812              for (p = pServer->connects.first; p; p = p->next) {                          for (p = pServer->connects.first; p; p = p->next) {
813                  printf("client: sock=%d addr=%s port=%d events=0x%04x.\n",                                  printf("client: sock=%d addr=%s port=%d events=0x%04x.\n",
814                      p->client.sock,                                          p->client.sock,
815                      inet_ntoa(p->client.addr.sin_addr),                                          inet_ntoa(p->client.addr.sin_addr),
816                      ntohs(p->client.addr.sin_port),                                          ntohs(p->client.addr.sin_port),
817                      (int) p->events                                          (int) p->events
818                  );                                  );
819              }                          }
820          }                  }
821          else                  else
822          if (cchLine > 0 && strcmp(szLine, "help") != 0)                  if (cchLine > 0 && strcmp(szLine, "help") != 0)
823              lscp_server_broadcast(pServer, LSCP_EVENT_MISCELLANEOUS, szLine, strlen(szLine));                          lscp_server_broadcast(pServer, LSCP_EVENT_MISCELLANEOUS, szLine, strlen(szLine));
824          else                  else
825              server_usage();                          server_usage();
826    
827          server_prompt();                  server_prompt();
828      }          }
829    
830      lscp_server_destroy(pServer);          lscp_server_destroy(pServer);
831    
832  #if defined(WIN32)  #if defined(WIN32)
833      WSACleanup();          WSACleanup();
834  #endif  #endif
835    
836      return 0;          return 0;
837  }  }
838    
839  // end of example_server.c  // end of example_server.c

Legend:
Removed from v.948  
changed lines
  Added in v.1019

  ViewVC Help
Powered by ViewVC