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

Legend:
Removed from v.962  
changed lines
  Added in v.963

  ViewVC Help
Powered by ViewVC