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

Legend:
Removed from v.735  
changed lines
  Added in v.983

  ViewVC Help
Powered by ViewVC