/[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 105 by capela, Fri Jun 4 14:48:59 2004 UTC revision 188 by capela, Thu Jul 8 09:13:36 2004 UTC
# Line 38  lscp_status_t server_callback ( lscp_con Line 38  lscp_status_t server_callback ( lscp_con
38      lscp_parser_t tok;      lscp_parser_t tok;
39      const char *pszResult = NULL;      const char *pszResult = NULL;
40      char szTemp[256];      char szTemp[256];
41      static int iChannel = 0;      int i;
42        static int iSamplerChannel = 0;
43        static int iAudioDevice = 0;
44        static int iMidiDevice  = 0;
45    
46      if (pchBuffer == NULL) {      if (pchBuffer == NULL) {
47          fprintf(stderr, "server_callback: addr=%s port=%d: ",          fprintf(stderr, "server_callback: addr=%s port=%d: ",
# Line 67  lscp_status_t server_callback ( lscp_con Line 70  lscp_status_t server_callback ( lscp_con
70                  pszResult = "ENGINE_NAME: DummyEngine\r\n"                  pszResult = "ENGINE_NAME: DummyEngine\r\n"
71                              "INSTRUMENT_FILE: DummyInstrument.gig\r\n"                              "INSTRUMENT_FILE: DummyInstrument.gig\r\n"
72                              "INSTRUMENT_NR: 0\r\n"                              "INSTRUMENT_NR: 0\r\n"
73                                "INSTRUMENT_STATUS: 100\r\n"
74                              "AUDIO_OUTPUT_DEVICE: 0\r\n"                              "AUDIO_OUTPUT_DEVICE: 0\r\n"
75                              "AUDIO_OUTPUT_CHANNELS: 2\r\n"                              "AUDIO_OUTPUT_CHANNELS: 2\r\n"
76                              "AUDIO_OUTPUT_ROUTING: 0,1\r\n"                              "AUDIO_OUTPUT_ROUTING: 0,1\r\n"
# Line 101  lscp_status_t server_callback ( lscp_con Line 105  lscp_status_t server_callback ( lscp_con
105                  }                  }
106                  else ret = LSCP_FAILED;                  else ret = LSCP_FAILED;
107              }              }
             else if (lscp_parser_test(&tok, "AUDIO_OUTPUT_TYPE")) {  
                 // Getting audio output type:  
                 // GET CHANNEL AUDIO_OUTPUT_TYPE <sampler-channel>  
                 // (unspecified as of draft 04)  
             }  
             else if (lscp_parser_test(&tok, "AUDIO_OUTPUT_CHANNEL")) {  
                 // Getting audio output channel:  
                 // GET CHANNEL AUDIO_OUTPUT_CHANNEL <sampler-channel>  
                 // (unspecified as of draft 04)  
             }  
108              else ret = LSCP_FAILED;              else ret = LSCP_FAILED;
109          }          }
110          else if (lscp_parser_test(&tok, "CHANNELS")) {          else if (lscp_parser_test(&tok, "CHANNELS")) {
111              // Current number of sampler channels:              // Current number of sampler channels:
112              // GET CHANNELS              // GET CHANNELS
113              sprintf(szTemp, "%d", iChannel);              sprintf(szTemp, "%d", iSamplerChannel);
114              pszResult = szTemp;              pszResult = szTemp;
115          }          }
116          else if (lscp_parser_test(&tok, "AVAILABLE_AUDIO_OUTPUT_DRIVERS")) {          else if (lscp_parser_test(&tok, "AVAILABLE_AUDIO_OUTPUT_DRIVERS")) {
117              // Getting all available audio output drivers.              // Getting all available audio output drivers.
118              // GET AVAILABLE_AUDIO_OUTPUT_DRIVERS              // GET AVAILABLE_AUDIO_OUTPUT_DRIVERS
119              pszResult = "ALSA,JACK\r\n";              pszResult = "Alsa,Jack,CoreAudio\r\n";
120          }          }
121          else if (lscp_parser_test(&tok, "AVAILABLE_MIDI_INPUT_DRIVERS")) {          else if (lscp_parser_test(&tok, "AVAILABLE_MIDI_INPUT_DRIVERS")) {
122              // Getting all available MIDI input drivers.              // Getting all available MIDI input drivers.
123              // GET AVAILABLE_MIDI_INPUT_DRIVERS              // GET AVAILABLE_MIDI_INPUT_DRIVERS
124              pszResult = "ALSA\r\n";              pszResult = "Alsa,MidiShare,CoreMidi\r\n";
125          }          }
126          else if (lscp_parser_test2(&tok, "AUDIO_OUTPUT_DRIVER", "INFO")) {          else if (lscp_parser_test2(&tok, "AUDIO_OUTPUT_DRIVER", "INFO")) {
127              // Getting informations about a specific audio output driver.              // Getting informations about a specific audio output driver.
128              // GET AUDIO_OUTPUT_DRIVER INFO <audio-output-type>              // GET AUDIO_OUTPUT_DRIVER INFO <audio-output-type>
129              if (lscp_parser_test(&tok, "ALSA")) {              if (lscp_parser_test(&tok, "Alsa")) {
130                  pszResult = "DESCRIPTION: 'ALSA PCM'\r\n"                  pszResult = "DESCRIPTION: 'ALSA PCM'\r\n"
131                              "VERSION: '1.0'\r\n"                              "VERSION: '1.0'\r\n"
132                              "PARAMETERS: CHANNELS,SAMPLERATE,ACTIVE,CARD\r\n";                              "PARAMETERS: channels,samplerate,active,card\r\n";
133              }              }
134              else if (lscp_parser_test(&tok, "JACK")) {              else if (lscp_parser_test(&tok, "Jack")) {
135                  pszResult = "DESCRIPTION: Jack Audio Connection Kit\r\n"                  pszResult = "DESCRIPTION: JACK Audio Connection Kit\r\n"
136                              "VERSION: 0.98.1\r\n"                              "VERSION: 0.98.1\r\n"
137                              "PARAMETERS: CHANNELS,SAMPLERATE,ACTIVE\r\n";                              "PARAMETERS: channels,samplerate,active\r\n";
138              }              }
139              else ret = LSCP_FAILED;              else ret = LSCP_FAILED;
140          }          }
141          else if (lscp_parser_test2(&tok, "MIDI_INPUT_DRIVER", "INFO")) {          else if (lscp_parser_test2(&tok, "MIDI_INPUT_DRIVER", "INFO")) {
142              // Getting informations about a specific MIDI input driver.              // Getting informations about a specific MIDI input driver.
143              // GET MIDI_INPUT_DRIVER INFO <midi-input-type>              // GET MIDI_INPUT_DRIVER INFO <midi-input-type>
144              if (lscp_parser_test(&tok, "ALSA")) {              if (lscp_parser_test(&tok, "Alsa")) {
145                  pszResult = "DESCRIPTION: ALSA Sequencer\r\n"                  pszResult = "DESCRIPTION: ALSA Sequencer\r\n"
146                              "VERSION: 1.0\r\n"                              "VERSION: 1.0\r\n"
147                              "PARAMETERS: PORTS,ACTIVE\r\n";                              "PARAMETERS: ports,active\r\n";
148                }
149                else ret = LSCP_FAILED;
150            }
151            else if (lscp_parser_test2(&tok, "AUDIO_OUTPUT_DRIVER_PARAMETER", "INFO")) {
152                // Getting informations about a specific audio output driver parameter.
153                // GET AUDIO_OUTPUT_DRIVER_PARAMETER INFO <audio-output-type> <param>
154                if (lscp_parser_test2(&tok, "Alsa", "active")) {
155                    pszResult = "DESCRIPTION: 'ALSA PCM device active state'\r\n"
156                                "TYPE: BOOL\r\n"
157                                "MANDATORY: TRUE\r\n"
158                                "FIX: TRUE\r\n"
159                                "MULTIPLICITY: FALSE\r\n"
160                                "DEPENDS: channels,samplerate,card\r\n"
161                                "DEFAULT: TRUE\r\n"
162                                "RANGE_MIN: FALSE\r\n"
163                                "RANGE_MAX: TRUE\r\n"
164                                "POSSIBILITIES: FALSE,TRUE\r\n";
165                }
166                else if (lscp_parser_test2(&tok, "Jack", "active")) {
167                    pszResult = "DESCRIPTION: 'JACK device active state'\r\n"
168                                "TYPE: BOOL\r\n"
169                                "MANDATORY: TRUE\r\n"
170                                "FIX: TRUE\r\n"
171                                "MULTIPLICITY: FALSE\r\n"
172                                "DEPENDS: channels,samplerate\r\n"
173                                "DEFAULT: TRUE\r\n"
174                                "RANGE_MIN: FALSE\r\n"
175                                "RANGE_MAX: TRUE\r\n"
176                                "POSSIBILITIES: FALSE,TRUE\r\n";
177                }
178                else ret = LSCP_FAILED;
179            }
180            else if (lscp_parser_test2(&tok, "MIDI_INPUT_DRIVER_PARAMETER", "INFO")) {
181                // Getting informations about a specific MIDI input driver parameter.
182                // GET MIDI_INPUT_DRIVER_PARAMETER INFO <midi-input-type> <param>
183                if (lscp_parser_test2(&tok, "Alsa", "active")) {
184                    pszResult = "DESCRIPTION: 'ALSA Sequencer device active state'\r\n"
185                                "TYPE: BOOL\r\n"
186                                "MANDATORY: TRUE\r\n"
187                                "FIX: TRUE\r\n"
188                                "MULTIPLICITY: FALSE\r\n"
189                                "DEPENDS: channels,ports\r\n"
190                                "DEFAULT: TRUE\r\n"
191                                "RANGE_MIN: FALSE\r\n"
192                                "RANGE_MAX: TRUE\r\n"
193                                "POSSIBILITIES: FALSE,TRUE\r\n";
194                }
195                else ret = LSCP_FAILED;
196            }
197            else if (lscp_parser_test2(&tok, "AUDIO_OUTPUT_DEVICE", "INFO")) {
198                // Getting informations about a specific audio output device.
199                // GET AUDIO_OUTPUT_DEVICE INFO <audio-device-id>
200                if (lscp_parser_nextint(&tok) < iAudioDevice) {
201                    pszResult = "driver: Alsa\r\n"
202                                "active: TRUE\r\n"
203                                "channels: 2\r\n"
204                                "samplerate: 44100\r\n";
205              }              }
206              else ret = LSCP_FAILED;              else ret = LSCP_FAILED;
207          }          }
208            else if (lscp_parser_test2(&tok, "MIDI_INPUT_DEVICE", "INFO")) {
209                // Getting informations about a specific MIDI input device.
210                // GET MIDI_INPUT_DEVICE INFO <midi-device-id>
211                if (lscp_parser_nextint(&tok) < iMidiDevice) {
212                    pszResult = "driver: Alsa\r\n"
213                                "active: TRUE\r\n"
214                                "channels: 16\r\n"
215                                "ports: 1\r\n";
216                }
217                else ret = LSCP_FAILED;
218            }
219            else if (lscp_parser_test(&tok, "AUDIO_OUTPUT_DEVICES")) {
220                // Getting all created audio output device count.
221                // GET AUDIO_OUTPUT_DEVICES
222                sprintf(szTemp, "%d\r\n", iAudioDevice);
223                pszResult = szTemp;
224            }
225            else if (lscp_parser_test(&tok, "MIDI_INPUT_DEVICES")) {
226                // Getting all created MID input device count.
227                // GET MIDI_INPUT_DEVICES
228                sprintf(szTemp, "%d\r\n", iMidiDevice);
229                pszResult = szTemp;
230            }
231          else if (lscp_parser_test(&tok, "AVAILABLE_ENGINES")) {          else if (lscp_parser_test(&tok, "AVAILABLE_ENGINES")) {
232              // Getting all available engines:              // Getting all available engines:
233              // GET AVAILABLE_ENGINES              // GET AVAILABLE_ENGINES
234              pszResult = "Engine1,Engine2,Engine3\r\n";              pszResult = "GigEngine,DLSEngine,AkaiEngine\r\n";
235          }          }
236          else if (lscp_parser_test2(&tok, "ENGINE", "INFO")) {          else if (lscp_parser_test2(&tok, "ENGINE", "INFO")) {
237              // Getting information about an engine.              // Getting information about an engine.
238              // GET ENGINE INFO <engine-name>              // GET ENGINE INFO <engine-name>
239              pszResult = "DESCRIPTION: DummyEngine\r\n"              if (lscp_parser_test(&tok, "GigEngine")) {
240                          "VERSION: 1.0\r\n";                  pszResult = "DESCRIPTION: GigaSampler Engine\r\n"
241                                "VERSION: 0.3\r\n";
242                }
243                else if (lscp_parser_test(&tok, "DLSEngine")) {
244                    pszResult = "DESCRIPTION: 'DLS Generic Engine'\r\n"
245                                "VERSION: 0.2\r\n";
246                }
247                else if (lscp_parser_test(&tok, "AkaiEngine")) {
248                    pszResult = "DESCRIPTION: Akai Sampler Engine\r\n"
249                                "VERSION: 0.1\r\n";
250                }
251                else ret = LSCP_FAILED;
252            }
253            else ret = LSCP_FAILED;
254        }
255        else if (lscp_parser_test(&tok, "LIST")) {
256            if (lscp_parser_test(&tok, "CHANNELS")) {
257                // Getting all created sampler channel list.
258                // LIST CHANNELS
259                if (iSamplerChannel > 0) {
260                    strcpy(szTemp, "0");
261                    for (i = 1; i < iSamplerChannel && strlen(szTemp) < sizeof(szTemp) - 8; i++)
262                        sprintf(szTemp + strlen(szTemp), ",%d", i);
263                    strcat(szTemp, "\r\n");
264                    pszResult = szTemp;
265                }
266                else ret = LSCP_FAILED;
267            }
268            else if (lscp_parser_test(&tok, "AUDIO_OUTPUT_DEVICES")) {
269                // Getting all created audio output device list.
270                // LIST AUDIO_OUTPUT_DEVICES
271                if (iAudioDevice > 0) {
272                    strcpy(szTemp, "0");
273                    for (i = 1; i < iAudioDevice && strlen(szTemp) < sizeof(szTemp) - 8; i++)
274                        sprintf(szTemp + strlen(szTemp), ",%d", i);
275                    strcat(szTemp, "\r\n");
276                    pszResult = szTemp;
277                }
278                else ret = LSCP_FAILED;
279            }
280            else if (lscp_parser_test(&tok, "MIDI_INPUT_DEVICES")) {
281                // Getting all created MID input device list.
282                // LIST MIDI_INPUT_DEVICES
283                if (iMidiDevice > 0) {
284                    strcpy(szTemp, "0");
285                    for (i = 1; i < iMidiDevice && strlen(szTemp) < sizeof(szTemp) - 8; i++)
286                        sprintf(szTemp + strlen(szTemp), ",%d", i);
287                    strcat(szTemp, "\r\n");
288                    pszResult = szTemp;
289                }
290                else ret = LSCP_FAILED;
291          }          }
292          else ret = LSCP_FAILED;          else ret = LSCP_FAILED;
293      }      }
# Line 177  lscp_status_t server_callback ( lscp_con Line 301  lscp_status_t server_callback ( lscp_con
301                  // Setting audio output type:                  // Setting audio output type:
302                  // SET CHANNEL AUDIO_OUTPUT_TYPE <sampler-channel> <audio-output-type>                  // SET CHANNEL AUDIO_OUTPUT_TYPE <sampler-channel> <audio-output-type>
303              }              }
304                else if (lscp_parser_test(&tok, "AUDIO_OUTPUT_DEVICE")) {
305                    // Setting audio output device:
306                    // SET CHANNEL AUDIO_OUTPUT_DEVICE <sampler-channel> <device-id>
307                }
308              else if (lscp_parser_test(&tok, "AUDIO_OUTPUT_CHANNEL")) {              else if (lscp_parser_test(&tok, "AUDIO_OUTPUT_CHANNEL")) {
309                  // Setting audio output channel:                  // Setting audio output channel:
310                  // SET CHANNEL AUDIO_OUTPUT_CHANNEL <sampler-channel> <audio-channel>                  // SET CHANNEL AUDIO_OUTPUT_CHANNEL <sampler-channel> <audio-in> <audio-out>
311              }              }
312              else if (lscp_parser_test(&tok, "MIDI_INPUT_TYPE")) {              else if (lscp_parser_test(&tok, "MIDI_INPUT_TYPE")) {
313                  // Setting MIDI input type:                  // Setting MIDI input type:
314                  // SET CHANNEL MIDI_INPUT_TYPE <sampler-channel> <midi-input-type>                  // SET CHANNEL MIDI_INPUT_TYPE <sampler-channel> <midi-input-type>
315              }              }
316                else if (lscp_parser_test(&tok, "MIDI_INPUT_DEVICE")) {
317                    // Setting MIDI input device:
318                    // SET CHANNEL MIDI_INPUT_DEVICE <sampler-channel> <device-id>
319                }
320              else if (lscp_parser_test(&tok, "MIDI_INPUT_PORT")) {              else if (lscp_parser_test(&tok, "MIDI_INPUT_PORT")) {
321                  // Setting MIDI input port:                  // Setting MIDI input port:
322                  // SET CHANNEL MIDI_INPUT_PORT <sampler-channel> <midi-input-port>                  // SET CHANNEL MIDI_INPUT_PORT <sampler-channel> <midi-input-port>
# Line 204  lscp_status_t server_callback ( lscp_con Line 336  lscp_status_t server_callback ( lscp_con
336          }          }
337          else if (lscp_parser_test(&tok, "INSTRUMENT")) {          else if (lscp_parser_test(&tok, "INSTRUMENT")) {
338              // Loading an instrument:              // Loading an instrument:
339              // LOAD INSTRUMENT <filename> <instr-index> <sampler-channel>              // LOAD INSTRUMENT [NON_MODAL] <filename> <instr-index> <sampler-channel>
340          }          }
341          else ret = LSCP_FAILED;          else ret = LSCP_FAILED;
342      }      }
343      else if (lscp_parser_test2(&tok, "ADD", "CHANNEL")) {      else if (lscp_parser_test2(&tok, "ADD", "CHANNEL")) {
344          // Adding a new sampler channel:          // Adding a new sampler channel:
345          // ADD CHANNEL          // ADD CHANNEL
346          sprintf(szTemp, "OK[%d]", iChannel++);          if (iSamplerChannel < 16) {
347          pszResult = szTemp;              sprintf(szTemp, "OK[%d]", iSamplerChannel++);        
348                pszResult = szTemp;
349            } else {
350                iSamplerChannel = 0;
351                ret = LSCP_FAILED;
352            }
353      }      }
354      else if (lscp_parser_test2(&tok, "REMOVE", "CHANNEL")) {      else if (lscp_parser_test2(&tok, "REMOVE", "CHANNEL")) {
355          // Removing a sampler channel:          // Removing a sampler channel:
356          // REMOVE CHANNEL <sampler-channel>          // REMOVE CHANNEL <sampler-channel>
357            if (lscp_parser_nextint(&tok) < iSamplerChannel)
358                iSamplerChannel--;
359            else
360                ret = LSCP_FAILED;
361      }      }
362      else if (lscp_parser_test2(&tok, "RESET", "CHANNEL")) {      else if (lscp_parser_test2(&tok, "RESET", "CHANNEL")) {
363          // Resetting a sampler channel:          // Resetting a sampler channel:
364          // RESET CHANNEL <sampler-channel>          // RESET CHANNEL <sampler-channel>
365            if (lscp_parser_nextint(&tok) > iSamplerChannel)
366                ret = LSCP_FAILED;
367        }
368        else if (lscp_parser_test(&tok, "CREATE")) {
369            if (lscp_parser_test(&tok, "AUDIO_OUTPUT_DEVICE")) {
370                // Creating an audio output device.
371                // CREATE AUDIO_OUTPUT_DEVICE <audio-output-driver> [<params>]
372                if (iAudioDevice < 8) {
373                    sprintf(szTemp, "OK[%d]", iAudioDevice++);
374                    pszResult = szTemp;
375                } else {
376                    iAudioDevice = 0;
377                    ret = LSCP_FAILED;
378                }
379            }
380            else if (lscp_parser_test(&tok, "MIDI_INPUT_DEVICE")) {
381                // Creating an MIDI input device.
382                // CREATE MIDI_INPUT_DEVICE <midi-input-driver> [<params>]
383                if (iMidiDevice < 8) {
384                    sprintf(szTemp, "OK[%d]", iMidiDevice++);
385                    pszResult = szTemp;
386                } else {
387                    iMidiDevice = 0;
388                    ret = LSCP_FAILED;
389                }
390            }
391            else ret = LSCP_FAILED;
392        }
393        else if (lscp_parser_test(&tok, "DESTROY")) {
394            if (lscp_parser_test(&tok, "AUDIO_OUTPUT_DEVICE")) {
395                // Destroying an audio output device.
396                // DESTROY AUDIO_OUTPUT_DEVICE <audio-device-id>
397                if (lscp_parser_nextint(&tok) < iAudioDevice)
398                    iAudioDevice--;
399                else
400                    ret = LSCP_FAILED;
401            }
402            else if (lscp_parser_test(&tok, "MIDI_INPUT_DEVICE")) {
403                // Destroying an MIDI intput device.
404                // DESTROY MIDI_INPUT_DEVICE <midi-device-id>
405                if (lscp_parser_nextint(&tok) < iMidiDevice)
406                    iMidiDevice--;
407                else
408                    ret = LSCP_FAILED;
409            }
410            else ret = LSCP_FAILED;
411      }      }
412      else if (lscp_parser_test2(&tok, "SUBSCRIBE", "NOTIFICATION")) {      else if (lscp_parser_test(&tok, "SUBSCRIBE")) {
413          // Register frontend for receiving UDP event messages:          // Register frontend for receiving event notification messages:
414          // SUBSCRIBE NOTIFICATION <udp-port>          // SUBSCRIBE <event>
415          ret = lscp_server_subscribe(pConnect, lscp_parser_nextint(&tok));          ret = lscp_server_subscribe(pConnect, lscp_event_from_text(lscp_parser_next(&tok)));
416      }      }
417      else if (lscp_parser_test2(&tok, "UNSUBSCRIBE", "NOTIFICATION")) {      else if (lscp_parser_test(&tok, "UNSUBSCRIBE")) {
418          // Deregister frontend for not receiving UDP event messages anymore:          // Deregister frontend for not receiving event notification messages anymore:
419          // UNSUBSCRIBE NOTIFICATION <session-id>          // UNSUBSCRIBE <event>
420          ret = lscp_server_unsubscribe(pConnect, lscp_parser_next(&tok));          ret = lscp_server_unsubscribe(pConnect, lscp_event_from_text(lscp_parser_next(&tok)));
421      }      }
422      else if (lscp_parser_test(&tok, "QUIT")) {      else if (lscp_parser_test(&tok, "QUIT")) {
423          // Close client connection:          // Close client connection:
# Line 300  int main (int argc, char *argv[] ) Line 487  int main (int argc, char *argv[] )
487          else          else
488          if (strcmp(szLine, "list") == 0) {          if (strcmp(szLine, "list") == 0) {
489              for (p = pServer->connects.first; p; p = p->next) {              for (p = pServer->connects.first; p; p = p->next) {
490                  printf("client: sock=%d addr=%s tcp.port=%d udp.port=%d ping=%d sessid=%s.\n",                  printf("client: sock=%d addr=%s port=%d events=0x%04x.\n",
491                      p->client.sock,                      p->client.sock,
492                      inet_ntoa(p->client.addr.sin_addr),                      inet_ntoa(p->client.addr.sin_addr),
493                      ntohs(p->client.addr.sin_port),                      ntohs(p->client.addr.sin_port),
494                      p->port,                      (int) p->events
                     p->ping,  
                     p->sessid  
495                  );                  );
496              }              }
497          }          }
498          else          else
499          if (cchLine > 0 && strcmp(szLine, "help") != 0)          if (cchLine > 0 && strcmp(szLine, "help") != 0)
500              lscp_server_broadcast(pServer, szLine, strlen(szLine));              lscp_server_broadcast(pServer, LSCP_EVENT_MISCELLANEOUS, szLine, strlen(szLine));
501          else          else
502              server_usage();              server_usage();
503    

Legend:
Removed from v.105  
changed lines
  Added in v.188

  ViewVC Help
Powered by ViewVC