/[svn]/linuxsampler/trunk/src/network/lscpserver.h
ViewVC logotype

Contents of /linuxsampler/trunk/src/network/lscpserver.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1781 - (show annotations) (download) (as text)
Mon Sep 29 18:21:21 2008 UTC (15 years, 6 months ago) by iliev
File MIME type: text/x-c++hdr
File size: 21661 byte(s)
* Implemented option for adding instruments in separate directories
  in the instruments database
  (patch by Chris Cherrett & Andrew Williams, a bit adjusted)

1 /***************************************************************************
2 * *
3 * LinuxSampler - modular, streaming capable sampler *
4 * *
5 * Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck *
6 * Copyright (C) 2005 - 2008 Christian Schoenebeck *
7 * *
8 * This library is free software; you can redistribute it and/or modify *
9 * it under the terms of the GNU General Public License as published by *
10 * the Free Software Foundation; either version 2 of the License, or *
11 * (at your option) any later version. *
12 * *
13 * This library is distributed in the hope that it will be useful, *
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
16 * GNU General Public License for more details. *
17 * *
18 * You should have received a copy of the GNU General Public License *
19 * along with this library; if not, write to the Free Software *
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
21 * MA 02111-1307 USA *
22 ***************************************************************************/
23
24 #ifndef __LSCPSERVER_H_
25 #define __LSCPSERVER_H_
26
27 #if defined(WIN32)
28 #include <windows.h>
29 typedef int socklen_t;
30 #else
31 #include <unistd.h>
32 #include <sys/types.h>
33 #include <sys/socket.h>
34 #include <sys/select.h>
35 #include <sys/time.h>
36 #include <netinet/in.h>
37 #include <netinet/tcp.h>
38 #include <arpa/inet.h>
39 #include <netdb.h>
40 #endif
41
42 #include <list>
43
44 #include "lscp.h"
45 #include "lscpparser.h"
46 #include "lscpevent.h"
47 #include "../Sampler.h"
48 #include "../common/Thread.h"
49 #include "../common/Mutex.h"
50 #include "../common/Condition.h"
51 #include "../common/global_private.h"
52
53 #include "../drivers/midi/MidiInstrumentMapper.h"
54 #include "../drivers/midi/VirtualMidiDevice.h"
55
56 #if HAVE_SQLITE3
57 #include "../db/InstrumentsDb.h"
58 #endif
59
60 /// TCP Port on which the server should listen for connection requests.
61 #define LSCP_ADDR INADDR_ANY
62 #define LSCP_PORT 8888
63
64 /// try up to 3 minutes to bind server socket
65 #define LSCP_SERVER_BIND_TIMEOUT 180
66
67 // External references to the main scanner and parser functions
68 extern int yyparse(void* YYPARSE_PARAM);
69
70 namespace LinuxSampler {
71
72 extern void restart(yyparse_param_t* pparam, int& yychar);
73
74 /**
75 * Network server for the LinuxSampler Control Protocol (LSCP).
76 */
77 class LSCPServer : public Thread {
78 public:
79 LSCPServer(Sampler* pSampler, long int addr, short int port);
80 virtual ~LSCPServer();
81 int WaitUntilInitialized(long TimeoutSeconds = 0L, long TimeoutNanoSeconds = 0L);
82
83 // Methods called by the parser
84 String DestroyAudioOutputDevice(uint DeviceIndex);
85 String DestroyMidiInputDevice(uint DeviceIndex);
86 String LoadInstrument(String Filename, uint uiInstrument, uint uiSamplerChannel, bool bBackground = false);
87 String SetEngineType(String EngineName, uint uiSamplerChannel);
88 String GetChannels();
89 String ListChannels();
90 String AddChannel();
91 String RemoveChannel(uint uiSamplerChannel);
92 String GetAvailableEngines();
93 String ListAvailableEngines();
94 String GetEngineInfo(String EngineName);
95 String GetChannelInfo(uint uiSamplerChannel);
96 String GetVoiceCount(uint uiSamplerChannel);
97 String GetStreamCount(uint uiSamplerChannel);
98 String GetBufferFill(fill_response_t ResponseType, uint uiSamplerChannel);
99 String GetAvailableAudioOutputDrivers();
100 String ListAvailableAudioOutputDrivers();
101 String GetAvailableMidiInputDrivers();
102 String ListAvailableMidiInputDrivers();
103 String GetAudioOutputDriverInfo(String Driver);
104 String GetMidiInputDriverInfo(String Driver);
105 #ifdef __GNUC__
106 typedef std::map<String,String> StringMap; // nasty workaround for a GCC bug (see GCC bug #15980, #57)
107 String GetAudioOutputDriverParameterInfo(String Driver, String Parameter, std::map<String,String> DependencyList = StringMap());
108 String GetMidiInputDriverParameterInfo(String Driver, String Parameter, std::map<String,String> DependencyList = StringMap());
109 String CreateAudioOutputDevice(String Driver, std::map<String,String> Parameters = StringMap());
110 String CreateMidiInputDevice(String Driver, std::map<String,String> Parameters = StringMap());
111 #else
112 String GetAudioOutputDriverParameterInfo(String Driver, String Parameter, std::map<String,String> DependencyList = std::map<String,String>());
113 String GetMidiInputDriverParameterInfo(String Driver, String Parameter, std::map<String,String> DependencyList = std::map<String,String>());
114 String CreateAudioOutputDevice(String Driver, std::map<String,String> Parameters = std::map<String,String>());
115 String CreateMidiInputDevice(String Driver, std::map<String,String> Parameters = std::map<String,String>());
116 #endif // __GNUC__
117 String GetAudioOutputDeviceCount();
118 String GetMidiInputDeviceCount();
119 String GetAudioOutputDevices();
120 String GetMidiInputDevices();
121 String GetAudioOutputDeviceInfo(uint DeviceIndex);
122 String GetMidiInputDeviceInfo(uint DeviceIndex);
123 String GetMidiInputPortInfo(uint DeviceIndex, uint PortIndex);
124 String GetMidiInputPortParameterInfo(uint DeviceId, uint PortId, String ParameterName);
125 String GetAudioOutputChannelInfo(uint DeviceId, uint ChannelId);
126 String GetAudioOutputChannelParameterInfo(uint DeviceId, uint ChannelId, String ParameterName);
127 String SetAudioOutputChannelParameter(uint DeviceId, uint ChannelId, String ParamKey, String ParamVal);
128 String SetAudioOutputDeviceParameter(uint DeviceIndex, String ParamKey, String ParamVal);
129 String SetMidiInputDeviceParameter(uint DeviceIndex, String ParamKey, String ParamVal);
130 String SetMidiInputPortParameter(uint DeviceIndex, uint PortIndex, String ParamKey, String ParamVal);
131 String SetAudioOutputChannel(uint ChannelAudioOutputChannel, uint AudioOutputDeviceInputChannel, uint uiSamplerChannel);
132 String SetAudioOutputDevice(uint AudioDeviceId, uint SamplerChannel);
133 String SetAudioOutputType(String AudioOutputDriver, uint uiSamplerChannel);
134 String SetMIDIInputPort(uint MIDIPort, uint uiSamplerChannel);
135 String SetMIDIInputChannel(uint MIDIChannel, uint uiSamplerChannel);
136 String SetMIDIInputDevice(uint MIDIDeviceId, uint uiSamplerChannel);
137 String SetMIDIInputType(String MidiInputDriver, uint uiSamplerChannel);
138 String SetMIDIInput(uint MIDIDeviceId, uint MIDIPort, uint MIDIChannel, uint uiSamplerChannel);
139 String SetVolume(double dVolume, uint uiSamplerChannel);
140 String SetChannelMute(bool bMute, uint uiSamplerChannel);
141 String SetChannelSolo(bool bSolo, uint uiSamplerChannel);
142 String AddOrReplaceMIDIInstrumentMapping(uint MidiMapID, uint MidiBank, uint MidiProg, String EngineType, String InstrumentFile, uint InstrumentIndex, float Volume, MidiInstrumentMapper::mode_t LoadMode, String Name, bool bModal);
143 String RemoveMIDIInstrumentMapping(uint MidiMapID, uint MidiBank, uint MidiProg);
144 String GetMidiInstrumentMappings(uint MidiMapID);
145 String GetAllMidiInstrumentMappings();
146 String GetMidiInstrumentMapping(uint MidiMapID, uint MidiBank, uint MidiProg);
147 String ListMidiInstrumentMappings(uint MidiMapID);
148 String ListAllMidiInstrumentMappings();
149 String ClearMidiInstrumentMappings(uint MidiMapID);
150 String ClearAllMidiInstrumentMappings();
151 String AddMidiInstrumentMap(String MapName = "");
152 String RemoveMidiInstrumentMap(uint MidiMapID);
153 String RemoveAllMidiInstrumentMaps();
154 String GetMidiInstrumentMaps();
155 String ListMidiInstrumentMaps();
156 String GetMidiInstrumentMap(uint MidiMapID);
157 String SetMidiInstrumentMapName(uint MidiMapID, String NewName);
158 String SetChannelMap(uint uiSamplerChannel, int MidiMapID);
159 String CreateFxSend(uint uiSamplerChannel, uint MidiCtrl, String Name = "");
160 String DestroyFxSend(uint uiSamplerChannel, uint FxSendID);
161 String GetFxSends(uint uiSamplerChannel);
162 String ListFxSends(uint uiSamplerChannel);
163 String GetFxSendInfo(uint uiSamplerChannel, uint FxSendID);
164 String SetFxSendName(uint uiSamplerChannel, uint FxSendID, String Name);
165 String SetFxSendAudioOutputChannel(uint uiSamplerChannel, uint FxSendID, uint FxSendChannel, uint DeviceChannel);
166 String SetFxSendMidiController(uint uiSamplerChannel, uint FxSendID, uint MidiController);
167 String SetFxSendLevel(uint uiSamplerChannel, uint FxSendID, double dLevel);
168 String AddDbInstrumentDirectory(String Dir);
169 String RemoveDbInstrumentDirectory(String Dir, bool Force = false);
170 String GetDbInstrumentDirectoryCount(String Dir, bool Recursive = false);
171 String GetDbInstrumentDirectories(String Dir, bool Recursive = false);
172 String GetDbInstrumentDirectoryInfo(String Dir);
173 String SetDbInstrumentDirectoryName(String Dir, String Name);
174 String MoveDbInstrumentDirectory(String Dir, String Dst);
175 String CopyDbInstrumentDirectory(String Dir, String Dst);
176 String SetDbInstrumentDirectoryDescription(String Dir, String Desc);
177 String FindDbInstrumentDirectories(String Dir, std::map<String,String> Parameters, bool Recursive = true);
178 String AddDbInstruments(String DbDir, String FilePath, int Index = -1, bool bBackground = false);
179 String AddDbInstruments(String ScanMode, String DbDir, String FsDir, bool bBackground = false, bool insDir = false);
180 String RemoveDbInstrument(String Instr);
181 String GetDbInstrumentCount(String Dir, bool Recursive = false);
182 String GetDbInstruments(String Dir, bool Recursive = false);
183 String GetDbInstrumentInfo(String Instr);
184 String SetDbInstrumentName(String Instr, String Name);
185 String MoveDbInstrument(String Instr, String Dst);
186 String CopyDbInstrument(String Instr, String Dst);
187 String SetDbInstrumentDescription(String Instr, String Desc);
188 String SetDbInstrumentFilePath(String OldPath, String NewPath);
189 String FindLostDbInstrumentFiles();
190 String FindDbInstruments(String Dir, std::map<String,String> Parameters, bool Recursive = true);
191 String FormatInstrumentsDb();
192 String EditSamplerChannelInstrument(uint uiSamplerChannel);
193 String GetDbInstrumentsJobInfo(int JobId);
194 String ResetChannel(uint uiSamplerChannel);
195 String ResetSampler();
196 String GetServerInfo();
197 String GetTotalStreamCount();
198 String GetTotalVoiceCount();
199 String GetTotalVoiceCountMax();
200 String GetGlobalVolume();
201 String SetGlobalVolume(double dVolume);
202 String GetFileInstruments(String Filename);
203 String ListFileInstruments(String Filename);
204 String GetFileInstrumentInfo(String Filename, uint InstrumentID);
205 String SendChannelMidiData(String MidiMsg, uint uiSamplerChannel, uint Arg1, uint Arg2);
206 String SubscribeNotification(LSCPEvent::event_t);
207 String UnsubscribeNotification(LSCPEvent::event_t);
208 String SetEcho(yyparse_param_t* pSession, double boolean_value);
209 void AnswerClient(String ReturnMessage);
210
211 static int currentSocket;
212 static std::map<int,String> bufferedCommands;
213
214 static void SendLSCPNotify( LSCPEvent Event );
215 static int EventSubscribers( std::list<LSCPEvent::event_t> events );
216 static void LockRTNotify();
217 static void UnlockRTNotify();
218 static String FilterEndlines(String s);
219
220 protected:
221 int hSocket;
222 sockaddr_in SocketAddress;
223 Sampler* pSampler;
224 Condition Initialized;
225
226 int Main(); ///< Implementation of virtual method from class Thread
227
228 private:
229
230 /**
231 * Find a created audio output device index.
232 */
233 int GetAudioOutputDeviceIndex (AudioOutputDevice *pDevice);
234
235 /**
236 * Find a created midi input device index.
237 */
238 int GetMidiInputDeviceIndex (MidiInputDevice *pDevice);
239
240 EngineChannel* GetEngineChannel(uint uiSamplerChannel);
241
242 /**
243 * Gets the specified effect send on the specified sampler channel.
244 */
245 FxSend* GetFxSend(uint uiSamplerChannel, uint FxSendID);
246
247 bool HasSoloChannel();
248 void MuteNonSoloChannels();
249 void UnmuteChannels();
250
251 /**
252 * Throws an exception if the specified file is not found or
253 * if directory is specified.
254 */
255 static void VerifyFile(String Filename);
256
257 static std::map<int,String> bufferedNotifies;
258 static Mutex NotifyMutex;
259 static Mutex NotifyBufferMutex;
260 static bool GetLSCPCommand( std::vector<yyparse_param_t>::iterator iter );
261 static void CloseConnection( std::vector<yyparse_param_t>::iterator iter );
262 static std::vector<yyparse_param_t> Sessions;
263 static Mutex SubscriptionMutex;
264 static std::map< LSCPEvent::event_t, std::list<int> > eventSubscriptions;
265 static fd_set fdSet;
266
267 //Protect main thread that generates real time notify messages
268 //like voice count, stream count and buffer fill
269 //from LSCP server removing engines and channels from underneath
270 static Mutex RTNotifyMutex;
271
272 class EventHandler : public ChannelCountListener, public AudioDeviceCountListener,
273 public MidiDeviceCountListener, public MidiInstrumentCountListener,
274 public MidiInstrumentInfoListener, public MidiInstrumentMapCountListener,
275 public MidiInstrumentMapInfoListener, public FxSendCountListener,
276 public VoiceCountListener, public StreamCountListener, public BufferFillListener,
277 public TotalStreamCountListener, public TotalVoiceCountListener,
278 public EngineChangeListener, public MidiPortCountListener {
279
280 public:
281 EventHandler(LSCPServer* pParent);
282
283 /**
284 * Invoked when the number of sampler channels has changed.
285 * @param NewCount The new number of sampler channels.
286 */
287 virtual void ChannelCountChanged(int NewCount);
288 virtual void ChannelAdded(SamplerChannel* pChannel);
289 virtual void ChannelToBeRemoved(SamplerChannel* pChannel);
290
291 /**
292 * Invoked when the number of audio output devices has changed.
293 * @param NewCount The new number of audio output devices.
294 */
295 virtual void AudioDeviceCountChanged(int NewCount);
296
297 /**
298 * Invoked when the number of MIDI input devices has changed.
299 * @param NewCount The new number of MIDI input devices.
300 */
301 virtual void MidiDeviceCountChanged(int NewCount);
302
303 /**
304 * Invoked right before the supplied MIDI input device is going
305 * to be destroyed.
306 * @param pDevice MidiInputDevice to be deleted
307 */
308 virtual void MidiDeviceToBeDestroyed(MidiInputDevice* pDevice);
309
310 /**
311 * Invoked to inform that a new MidiInputDevice has just been
312 * created.
313 * @param pDevice newly created MidiInputDevice
314 */
315 virtual void MidiDeviceCreated(MidiInputDevice* pDevice);
316
317 /**
318 * Invoked when the number of MIDI input ports has changed.
319 * @param NewCount The new number of MIDI input ports.
320 */
321 virtual void MidiPortCountChanged(int NewCount);
322
323 /**
324 * Invoked right before the supplied MIDI input port is going
325 * to be destroyed.
326 * @param pPort MidiInputPort to be deleted
327 */
328 virtual void MidiPortToBeRemoved(MidiInputPort* pPort);
329
330 /**
331 * Invoked to inform that a new MidiInputPort has just been
332 * added.
333 * @param pPort newly created MidiInputPort
334 */
335 virtual void MidiPortAdded(MidiInputPort* pPort);
336
337 /**
338 * Invoked when the number of MIDI instruments has changed.
339 * @param MapId The numerical ID of the MIDI instrument map.
340 * @param NewCount The new number of MIDI instruments.
341 */
342 virtual void MidiInstrumentCountChanged(int MapId, int NewCount);
343
344 /**
345 * Invoked when a MIDI instrument in a MIDI instrument map is changed.
346 * @param MapId The numerical ID of the MIDI instrument map.
347 * @param Bank The index of the MIDI bank, containing the instrument.
348 * @param Program The MIDI program number of the instrument.
349 */
350 virtual void MidiInstrumentInfoChanged(int MapId, int Bank, int Program);
351
352 /**
353 * Invoked when the number of MIDI instrument maps has changed.
354 * @param NewCount The new number of MIDI instruments.
355 */
356 virtual void MidiInstrumentMapCountChanged(int NewCount);
357
358 /**
359 * Invoked when the settings of a MIDI instrument map are changed.
360 * @param MapId The numerical ID of the MIDI instrument map.
361 */
362 virtual void MidiInstrumentMapInfoChanged(int MapId);
363
364 /**
365 * Invoked when the number of effect sends
366 * on the specified sampler channel has changed.
367 * @param ChannelId The numerical ID of the sampler channel.
368 * @param NewCount The new number of effect sends.
369 */
370 virtual void FxSendCountChanged(int ChannelId, int NewCount);
371
372 /**
373 * Invoked when the number of active voices
374 * on the specified sampler channel has changed.
375 * @param ChannelId The numerical ID of the sampler channel.
376 * @param NewCount The new number of active voices.
377 */
378 virtual void VoiceCountChanged(int ChannelId, int NewCount);
379
380 /**
381 * Invoked when the number of active disk streams
382 * on the specified sampler channel has changed.
383 * @param ChannelId The numerical ID of the sampler channel.
384 * @param NewCount The new number of active disk streams.
385 */
386 virtual void StreamCountChanged(int ChannelId, int NewCount);
387
388 /**
389 * Invoked when the fill state of the disk stream
390 * buffers on the specified sampler channel is changed.
391 * @param ChannelId The numerical ID of the sampler channel.
392 * @param FillData The buffer fill data for the specified sampler channel.
393 */
394 virtual void BufferFillChanged(int ChannelId, String FillData);
395
396 /**
397 * Invoked when the total number of active voices is changed.
398 * @param NewCount The new number of active voices.
399 */
400 virtual void TotalVoiceCountChanged(int NewCount);
401 virtual void TotalStreamCountChanged(int NewCount);
402
403 virtual void EngineToBeChanged(int ChannelId);
404 virtual void EngineChanged(int ChannelId);
405
406 virtual ~EventHandler();
407
408 struct midi_listener_entry {
409 SamplerChannel* pSamplerChannel;
410 EngineChannel* pEngineChannel;
411 VirtualMidiDevice* pMidiListener;
412 };
413
414 std::vector<midi_listener_entry> channelMidiListeners;
415
416 struct device_midi_listener_entry {
417 MidiInputPort* pPort;
418 VirtualMidiDevice* pMidiListener;
419 uint uiDeviceID;
420 };
421
422 std::vector<device_midi_listener_entry> deviceMidiListeners;
423
424 private:
425 LSCPServer* pParent;
426 } eventHandler;
427
428 #if HAVE_SQLITE3
429 class DbInstrumentsEventHandler : public InstrumentsDb::Listener {
430 public:
431 virtual void DirectoryCountChanged(String Dir);
432 virtual void DirectoryInfoChanged(String Dir);
433 virtual void DirectoryNameChanged(String Dir, String NewName);
434 virtual void InstrumentCountChanged(String Dir);
435 virtual void InstrumentInfoChanged(String Instr);
436 virtual void InstrumentNameChanged(String Instr, String NewName);
437 virtual void JobStatusChanged(int JobId);
438 } dbInstrumentsEventHandler;
439 #endif // HAVE_SQLITE3
440 };
441
442 }
443
444 #endif // __LSCPSERVER_H_

  ViewVC Help
Powered by ViewVC