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

Legend:
Removed from v.946  
changed lines
  Added in v.985

  ViewVC Help
Powered by ViewVC