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

Legend:
Removed from v.146  
changed lines
  Added in v.988

  ViewVC Help
Powered by ViewVC