/[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 1551 - (show annotations) (download) (as text)
Wed Dec 5 22:05:28 2007 UTC (16 years, 4 months ago) by schoenebeck
File MIME type: text/x-c++hdr
File size: 18935 byte(s)
- seems Windows has problems with accessing static variables from
  a static libtool archive

1 /***************************************************************************
2 * *
3 * LinuxSampler - modular, streaming capable sampler *
4 * *
5 * Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck *
6 * Copyright (C) 2005 - 2007 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 "lscp.h"
47 #include "lscpevent.h"
48 #include "../Sampler.h"
49 #include "../common/Thread.h"
50 #include "../common/Mutex.h"
51 #include "../common/Condition.h"
52 #include "../common/global_private.h"
53
54 #include "../drivers/midi/MidiInstrumentMapper.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 using namespace LinuxSampler;
68
69 // External references to the main scanner and parser functions
70 extern int yyparse(void* YYPARSE_PARAM);
71 extern void restart(yyparse_param_t* pparam, int& yychar);
72
73 /**
74 * Network server for the LinuxSampler Control Protocol (LSCP).
75 */
76 class LSCPServer : public Thread {
77 public:
78 LSCPServer(Sampler* pSampler, long int addr, short int port);
79 virtual ~LSCPServer();
80 int WaitUntilInitialized(long TimeoutSeconds = 0L, long TimeoutNanoSeconds = 0L);
81
82 // Methods called by the parser
83 String DestroyAudioOutputDevice(uint DeviceIndex);
84 String DestroyMidiInputDevice(uint DeviceIndex);
85 String LoadInstrument(String Filename, uint uiInstrument, uint uiSamplerChannel, bool bBackground = false);
86 String SetEngineType(String EngineName, uint uiSamplerChannel);
87 String GetChannels();
88 String ListChannels();
89 String AddChannel();
90 String RemoveChannel(uint uiSamplerChannel);
91 String GetAvailableEngines();
92 String ListAvailableEngines();
93 String GetEngineInfo(String EngineName);
94 String GetChannelInfo(uint uiSamplerChannel);
95 String GetVoiceCount(uint uiSamplerChannel);
96 String GetStreamCount(uint uiSamplerChannel);
97 String GetBufferFill(fill_response_t ResponseType, uint uiSamplerChannel);
98 String GetAvailableAudioOutputDrivers();
99 String ListAvailableAudioOutputDrivers();
100 String GetAvailableMidiInputDrivers();
101 String ListAvailableMidiInputDrivers();
102 String GetAudioOutputDriverInfo(String Driver);
103 String GetMidiInputDriverInfo(String Driver);
104 #ifdef __GNUC__
105 typedef std::map<String,String> StringMap; // nasty workaround for a GCC bug (see GCC bug #15980, #57)
106 String GetAudioOutputDriverParameterInfo(String Driver, String Parameter, std::map<String,String> DependencyList = StringMap());
107 String GetMidiInputDriverParameterInfo(String Driver, String Parameter, std::map<String,String> DependencyList = StringMap());
108 String CreateAudioOutputDevice(String Driver, std::map<String,String> Parameters = StringMap());
109 String CreateMidiInputDevice(String Driver, std::map<String,String> Parameters = StringMap());
110 #else
111 String GetAudioOutputDriverParameterInfo(String Driver, String Parameter, std::map<String,String> DependencyList = std::map<String,String>());
112 String GetMidiInputDriverParameterInfo(String Driver, String Parameter, std::map<String,String> DependencyList = std::map<String,String>());
113 String CreateAudioOutputDevice(String Driver, std::map<String,String> Parameters = std::map<String,String>());
114 String CreateMidiInputDevice(String Driver, std::map<String,String> Parameters = std::map<String,String>());
115 #endif // __GNUC__
116 String GetAudioOutputDeviceCount();
117 String GetMidiInputDeviceCount();
118 String GetAudioOutputDevices();
119 String GetMidiInputDevices();
120 String GetAudioOutputDeviceInfo(uint DeviceIndex);
121 String GetMidiInputDeviceInfo(uint DeviceIndex);
122 String GetMidiInputPortInfo(uint DeviceIndex, uint PortIndex);
123 String GetMidiInputPortParameterInfo(uint DeviceId, uint PortId, String ParameterName);
124 String GetAudioOutputChannelInfo(uint DeviceId, uint ChannelId);
125 String GetAudioOutputChannelParameterInfo(uint DeviceId, uint ChannelId, String ParameterName);
126 String SetAudioOutputChannelParameter(uint DeviceId, uint ChannelId, String ParamKey, String ParamVal);
127 String SetAudioOutputDeviceParameter(uint DeviceIndex, String ParamKey, String ParamVal);
128 String SetMidiInputDeviceParameter(uint DeviceIndex, String ParamKey, String ParamVal);
129 String SetMidiInputPortParameter(uint DeviceIndex, uint PortIndex, String ParamKey, String ParamVal);
130 String SetAudioOutputChannel(uint ChannelAudioOutputChannel, uint AudioOutputDeviceInputChannel, uint uiSamplerChannel);
131 String SetAudioOutputDevice(uint AudioDeviceId, uint SamplerChannel);
132 String SetAudioOutputType(String AudioOutputDriver, uint uiSamplerChannel);
133 String SetMIDIInputPort(uint MIDIPort, uint uiSamplerChannel);
134 String SetMIDIInputChannel(uint MIDIChannel, uint uiSamplerChannel);
135 String SetMIDIInputDevice(uint MIDIDeviceId, uint uiSamplerChannel);
136 String SetMIDIInputType(String MidiInputDriver, uint uiSamplerChannel);
137 String SetMIDIInput(uint MIDIDeviceId, uint MIDIPort, uint MIDIChannel, uint uiSamplerChannel);
138 String SetVolume(double dVolume, uint uiSamplerChannel);
139 String SetChannelMute(bool bMute, uint uiSamplerChannel);
140 String SetChannelSolo(bool bSolo, uint uiSamplerChannel);
141 String AddOrReplaceMIDIInstrumentMapping(uint MidiMapID, uint MidiBank, uint MidiProg, String EngineType, String InstrumentFile, uint InstrumentIndex, float Volume, MidiInstrumentMapper::mode_t LoadMode, String Name, bool bModal);
142 String RemoveMIDIInstrumentMapping(uint MidiMapID, uint MidiBank, uint MidiProg);
143 String GetMidiInstrumentMappings(uint MidiMapID);
144 String GetAllMidiInstrumentMappings();
145 String GetMidiInstrumentMapping(uint MidiMapID, uint MidiBank, uint MidiProg);
146 String ListMidiInstrumentMappings(uint MidiMapID);
147 String ListAllMidiInstrumentMappings();
148 String ClearMidiInstrumentMappings(uint MidiMapID);
149 String ClearAllMidiInstrumentMappings();
150 String AddMidiInstrumentMap(String MapName = "");
151 String RemoveMidiInstrumentMap(uint MidiMapID);
152 String RemoveAllMidiInstrumentMaps();
153 String GetMidiInstrumentMaps();
154 String ListMidiInstrumentMaps();
155 String GetMidiInstrumentMap(uint MidiMapID);
156 String SetMidiInstrumentMapName(uint MidiMapID, String NewName);
157 String SetChannelMap(uint uiSamplerChannel, int MidiMapID);
158 String CreateFxSend(uint uiSamplerChannel, uint MidiCtrl, String Name = "");
159 String DestroyFxSend(uint uiSamplerChannel, uint FxSendID);
160 String GetFxSends(uint uiSamplerChannel);
161 String ListFxSends(uint uiSamplerChannel);
162 String GetFxSendInfo(uint uiSamplerChannel, uint FxSendID);
163 String SetFxSendName(uint uiSamplerChannel, uint FxSendID, String Name);
164 String SetFxSendAudioOutputChannel(uint uiSamplerChannel, uint FxSendID, uint FxSendChannel, uint DeviceChannel);
165 String SetFxSendMidiController(uint uiSamplerChannel, uint FxSendID, uint MidiController);
166 String SetFxSendLevel(uint uiSamplerChannel, uint FxSendID, double dLevel);
167 String AddDbInstrumentDirectory(String Dir);
168 String RemoveDbInstrumentDirectory(String Dir, bool Force = false);
169 String GetDbInstrumentDirectoryCount(String Dir, bool Recursive = false);
170 String GetDbInstrumentDirectories(String Dir, bool Recursive = false);
171 String GetDbInstrumentDirectoryInfo(String Dir);
172 String SetDbInstrumentDirectoryName(String Dir, String Name);
173 String MoveDbInstrumentDirectory(String Dir, String Dst);
174 String CopyDbInstrumentDirectory(String Dir, String Dst);
175 String SetDbInstrumentDirectoryDescription(String Dir, String Desc);
176 String FindDbInstrumentDirectories(String Dir, std::map<String,String> Parameters, bool Recursive = true);
177 String AddDbInstruments(String DbDir, String FilePath, int Index = -1, bool bBackground = false);
178 String AddDbInstruments(String ScanMode, String DbDir, String FsDir, bool bBackground = false);
179 String RemoveDbInstrument(String Instr);
180 String GetDbInstrumentCount(String Dir, bool Recursive = false);
181 String GetDbInstruments(String Dir, bool Recursive = false);
182 String GetDbInstrumentInfo(String Instr);
183 String SetDbInstrumentName(String Instr, String Name);
184 String MoveDbInstrument(String Instr, String Dst);
185 String CopyDbInstrument(String Instr, String Dst);
186 String SetDbInstrumentDescription(String Instr, String Desc);
187 String FindDbInstruments(String Dir, std::map<String,String> Parameters, bool Recursive = true);
188 String FormatInstrumentsDb();
189 String EditSamplerChannelInstrument(uint uiSamplerChannel);
190 String GetDbInstrumentsJobInfo(int JobId);
191 String ResetChannel(uint uiSamplerChannel);
192 String ResetSampler();
193 String GetServerInfo();
194 String GetTotalStreamCount();
195 String GetTotalVoiceCount();
196 String GetTotalVoiceCountMax();
197 String GetGlobalVolume();
198 String SetGlobalVolume(double dVolume);
199 String GetFileInstruments(String Filename);
200 String ListFileInstruments(String Filename);
201 String GetFileInstrumentInfo(String Filename, uint InstrumentID);
202 String SubscribeNotification(LSCPEvent::event_t);
203 String UnsubscribeNotification(LSCPEvent::event_t);
204 String SetEcho(yyparse_param_t* pSession, double boolean_value);
205 void AnswerClient(String ReturnMessage);
206
207 static int currentSocket;
208 static std::map<int,String> bufferedCommands;
209
210 static void SendLSCPNotify( LSCPEvent Event );
211 static int EventSubscribers( std::list<LSCPEvent::event_t> events );
212 static void LockRTNotify();
213 static void UnlockRTNotify();
214 static String FilterEndlines(String s);
215
216 protected:
217 int hSocket;
218 sockaddr_in SocketAddress;
219 Sampler* pSampler;
220 Condition Initialized;
221
222 int Main(); ///< Implementation of virtual method from class Thread
223
224 private:
225
226 /**
227 * Find a created audio output device index.
228 */
229 int GetAudioOutputDeviceIndex (AudioOutputDevice *pDevice);
230
231 /**
232 * Find a created midi input device index.
233 */
234 int GetMidiInputDeviceIndex (MidiInputDevice *pDevice);
235
236 EngineChannel* GetEngineChannel(uint uiSamplerChannel);
237
238 /**
239 * Gets the specified effect send on the specified sampler channel.
240 */
241 FxSend* GetFxSend(uint uiSamplerChannel, uint FxSendID);
242
243 bool HasSoloChannel();
244 void MuteNonSoloChannels();
245 void UnmuteChannels();
246
247 /**
248 * Throws an exception if the specified file is not found or
249 * if directory is specified.
250 */
251 static void VerifyFile(String Filename);
252
253 static std::map<int,String> bufferedNotifies;
254 static Mutex NotifyMutex;
255 static Mutex NotifyBufferMutex;
256 static bool GetLSCPCommand( std::vector<yyparse_param_t>::iterator iter );
257 static void CloseConnection( std::vector<yyparse_param_t>::iterator iter );
258 static std::vector<yyparse_param_t> Sessions;
259 static Mutex SubscriptionMutex;
260 static std::map< LSCPEvent::event_t, std::list<int> > eventSubscriptions;
261 static fd_set fdSet;
262
263 //Protect main thread that generates real time notify messages
264 //like voice count, stream count and buffer fill
265 //from LSCP server removing engines and channels from underneath
266 static Mutex RTNotifyMutex;
267
268 class EventHandler : public ChannelCountListener, public AudioDeviceCountListener,
269 public MidiDeviceCountListener, public MidiInstrumentCountListener,
270 public MidiInstrumentInfoListener, public MidiInstrumentMapCountListener,
271 public MidiInstrumentMapInfoListener, public FxSendCountListener,
272 public VoiceCountListener, public StreamCountListener, public BufferFillListener,
273 public TotalStreamCountListener, public TotalVoiceCountListener {
274
275 public:
276 /**
277 * Invoked when the number of sampler channels has changed.
278 * @param NewCount The new number of sampler channels.
279 */
280 virtual void ChannelCountChanged(int NewCount);
281
282 /**
283 * Invoked when the number of audio output devices has changed.
284 * @param NewCount The new number of audio output devices.
285 */
286 virtual void AudioDeviceCountChanged(int NewCount);
287
288 /**
289 * Invoked when the number of MIDI input devices has changed.
290 * @param NewCount The new number of MIDI input devices.
291 */
292 virtual void MidiDeviceCountChanged(int NewCount);
293
294 /**
295 * Invoked when the number of MIDI instruments has changed.
296 * @param MapId The numerical ID of the MIDI instrument map.
297 * @param NewCount The new number of MIDI instruments.
298 */
299 virtual void MidiInstrumentCountChanged(int MapId, int NewCount);
300
301 /**
302 * Invoked when a MIDI instrument in a MIDI instrument map is changed.
303 * @param MapId The numerical ID of the MIDI instrument map.
304 * @param Bank The index of the MIDI bank, containing the instrument.
305 * @param Program The MIDI program number of the instrument.
306 */
307 virtual void MidiInstrumentInfoChanged(int MapId, int Bank, int Program);
308
309 /**
310 * Invoked when the number of MIDI instrument maps has changed.
311 * @param NewCount The new number of MIDI instruments.
312 */
313 virtual void MidiInstrumentMapCountChanged(int NewCount);
314
315 /**
316 * Invoked when the settings of a MIDI instrument map are changed.
317 * @param MapId The numerical ID of the MIDI instrument map.
318 */
319 virtual void MidiInstrumentMapInfoChanged(int MapId);
320
321 /**
322 * Invoked when the number of effect sends
323 * on the specified sampler channel has changed.
324 * @param ChannelId The numerical ID of the sampler channel.
325 * @param NewCount The new number of effect sends.
326 */
327 virtual void FxSendCountChanged(int ChannelId, int NewCount);
328
329 /**
330 * Invoked when the number of active voices
331 * on the specified sampler channel has changed.
332 * @param ChannelId The numerical ID of the sampler channel.
333 * @param NewCount The new number of active voices.
334 */
335 virtual void VoiceCountChanged(int ChannelId, int NewCount);
336
337 /**
338 * Invoked when the number of active disk streams
339 * on the specified sampler channel has changed.
340 * @param ChannelId The numerical ID of the sampler channel.
341 * @param NewCount The new number of active disk streams.
342 */
343 virtual void StreamCountChanged(int ChannelId, int NewCount);
344
345 /**
346 * Invoked when the fill state of the disk stream
347 * buffers on the specified sampler channel is changed.
348 * @param ChannelId The numerical ID of the sampler channel.
349 * @param FillData The buffer fill data for the specified sampler channel.
350 */
351 virtual void BufferFillChanged(int ChannelId, String FillData);
352
353 /**
354 * Invoked when the total number of active voices is changed.
355 * @param NewCount The new number of active voices.
356 */
357 virtual void TotalVoiceCountChanged(int NewCount);
358 virtual void TotalStreamCountChanged(int NewCount);
359 } eventHandler;
360
361 #if HAVE_SQLITE3
362 class DbInstrumentsEventHandler : public InstrumentsDb::Listener {
363 public:
364 virtual void DirectoryCountChanged(String Dir);
365 virtual void DirectoryInfoChanged(String Dir);
366 virtual void DirectoryNameChanged(String Dir, String NewName);
367 virtual void InstrumentCountChanged(String Dir);
368 virtual void InstrumentInfoChanged(String Instr);
369 virtual void InstrumentNameChanged(String Instr, String NewName);
370 virtual void JobStatusChanged(int JobId);
371 } dbInstrumentsEventHandler;
372 #endif // HAVE_SQLITE3
373 };
374
375 #endif // __LSCPSERVER_H_

  ViewVC Help
Powered by ViewVC