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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1187 by iliev, Wed May 16 14:22:26 2007 UTC revision 2500 by schoenebeck, Fri Jan 10 12:20:05 2014 UTC
# Line 3  Line 3 
3   *   LinuxSampler - modular, streaming capable sampler                     *   *   LinuxSampler - modular, streaming capable sampler                     *
4   *                                                                         *   *                                                                         *
5   *   Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck   *   *   Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck   *
6   *   Copyright (C) 2005 - 2007 Christian Schoenebeck                       *   *   Copyright (C) 2005 - 2014 Christian Schoenebeck                       *
7   *                                                                         *   *                                                                         *
8   *   This library is free software; you can redistribute it and/or modify  *   *   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  *   *   it under the terms of the GNU General Public License as published by  *
# Line 24  Line 24 
24  #ifndef __LSCPSERVER_H_  #ifndef __LSCPSERVER_H_
25  #define __LSCPSERVER_H_  #define __LSCPSERVER_H_
26    
27    #if defined(WIN32)
28    #include <windows.h>
29    typedef int socklen_t;
30    #else
31  #include <unistd.h>  #include <unistd.h>
32  #include <sys/types.h>  #include <sys/types.h>
33  #include <sys/socket.h>  #include <sys/socket.h>
# Line 33  Line 37 
37  #include <netinet/tcp.h>  #include <netinet/tcp.h>
38  #include <arpa/inet.h>  #include <arpa/inet.h>
39  #include <netdb.h>  #include <netdb.h>
40    #endif
41    
42  #include <list>  #include <list>
43    
44  #include "lscp.h"  #include "lscp.h"
45  #include "lscpparser.h"  #include "lscpparser.h"
 #include "lscp.h"  
46  #include "lscpevent.h"  #include "lscpevent.h"
47  #include "../Sampler.h"  #include "../Sampler.h"
48  #include "../common/Thread.h"  #include "../common/Thread.h"
49  #include "../common/Mutex.h"  #include "../common/Mutex.h"
50  #include "../common/Condition.h"  #include "../common/Condition.h"
51  #include "../common/global.h"  #include "../common/global_private.h"
52    
53  #include "../drivers/midi/MidiInstrumentMapper.h"  #include "../drivers/midi/MidiInstrumentMapper.h"
54    #include "../drivers/midi/VirtualMidiDevice.h"
55    
56  #if HAVE_SQLITE3  #if HAVE_SQLITE3
57  #include "../db/InstrumentsDb.h"  #include "../db/InstrumentsDb.h"
# Line 59  Line 64 
64  /// try up to 3 minutes to bind server socket  /// try up to 3 minutes to bind server socket
65  #define LSCP_SERVER_BIND_TIMEOUT 180  #define LSCP_SERVER_BIND_TIMEOUT 180
66    
 using namespace LinuxSampler;  
   
67  // External references to the main scanner and parser functions  // External references to the main scanner and parser functions
68  extern int yyparse(void* YYPARSE_PARAM);  extern int yyparse(void* YYPARSE_PARAM);
69    
70    namespace LinuxSampler {
71    
72  extern void restart(yyparse_param_t* pparam, int& yychar);  extern void restart(yyparse_param_t* pparam, int& yychar);
73    
74  /**  /**
# Line 73  class LSCPServer : public Thread { Line 79  class LSCPServer : public Thread {
79          LSCPServer(Sampler* pSampler, long int addr, short int port);          LSCPServer(Sampler* pSampler, long int addr, short int port);
80          virtual ~LSCPServer();          virtual ~LSCPServer();
81          int WaitUntilInitialized(long TimeoutSeconds = 0L, long TimeoutNanoSeconds = 0L);          int WaitUntilInitialized(long TimeoutSeconds = 0L, long TimeoutNanoSeconds = 0L);
82            void RemoveListeners();
83    
84          // Methods called by the parser          // Methods called by the parser
85          String DestroyAudioOutputDevice(uint DeviceIndex);          String DestroyAudioOutputDevice(uint DeviceIndex);
# Line 125  class LSCPServer : public Thread { Line 132  class LSCPServer : public Thread {
132          String SetAudioOutputChannel(uint ChannelAudioOutputChannel, uint AudioOutputDeviceInputChannel, uint uiSamplerChannel);          String SetAudioOutputChannel(uint ChannelAudioOutputChannel, uint AudioOutputDeviceInputChannel, uint uiSamplerChannel);
133          String SetAudioOutputDevice(uint AudioDeviceId, uint SamplerChannel);          String SetAudioOutputDevice(uint AudioDeviceId, uint SamplerChannel);
134          String SetAudioOutputType(String AudioOutputDriver, uint uiSamplerChannel);          String SetAudioOutputType(String AudioOutputDriver, uint uiSamplerChannel);
135            String AddChannelMidiInput(uint uiSamplerChannel, uint MIDIDeviceId, uint MIDIPort = 0);
136            String RemoveChannelMidiInput(uint uiSamplerChannel);
137            String RemoveChannelMidiInput(uint uiSamplerChannel, uint MIDIDeviceId);
138            String RemoveChannelMidiInput(uint uiSamplerChannel, uint MIDIDeviceId, uint MIDIPort);
139            String ListChannelMidiInputs(uint uiSamplerChannel);
140          String SetMIDIInputPort(uint MIDIPort, uint uiSamplerChannel);          String SetMIDIInputPort(uint MIDIPort, uint uiSamplerChannel);
141          String SetMIDIInputChannel(uint MIDIChannel, uint uiSamplerChannel);          String SetMIDIInputChannel(uint MIDIChannel, uint uiSamplerChannel);
142          String SetMIDIInputDevice(uint MIDIDeviceId, uint uiSamplerChannel);          String SetMIDIInputDevice(uint MIDIDeviceId, uint uiSamplerChannel);
# Line 159  class LSCPServer : public Thread { Line 171  class LSCPServer : public Thread {
171          String SetFxSendAudioOutputChannel(uint uiSamplerChannel, uint FxSendID, uint FxSendChannel, uint DeviceChannel);          String SetFxSendAudioOutputChannel(uint uiSamplerChannel, uint FxSendID, uint FxSendChannel, uint DeviceChannel);
172          String SetFxSendMidiController(uint uiSamplerChannel, uint FxSendID, uint MidiController);          String SetFxSendMidiController(uint uiSamplerChannel, uint FxSendID, uint MidiController);
173          String SetFxSendLevel(uint uiSamplerChannel, uint FxSendID, double dLevel);          String SetFxSendLevel(uint uiSamplerChannel, uint FxSendID, double dLevel);
174            String SetFxSendEffect(uint uiSamplerChannel, uint FxSendID, int iSendEffectChain, int iEffectChainPosition);
175    
176            // effect commands
177            String GetAvailableEffects();
178            String ListAvailableEffects();
179            String GetEffectInfo(int iEffectIndex);
180            String CreateEffectInstance(int iEffectIndex);
181            String CreateEffectInstance(String effectSystem, String module, String effectName);
182            String DestroyEffectInstance(int iEffectInstance);
183            String GetEffectInstances();
184            String ListEffectInstances();
185            String GetEffectInstanceInfo(int iEffectInstance);
186            String GetEffectInstanceInputControlInfo(int iEffectInstance, int iInputControlIndex);
187            String SetEffectInstanceInputControlValue(int iEffectInstance, int iInputControlIndex, double dValue);
188            String GetSendEffectChains(int iAudioOutputDevice);
189            String ListSendEffectChains(int iAudioOutputDevice);
190            String AddSendEffectChain(int iAudioOutputDevice);
191            String RemoveSendEffectChain(int iAudioOutputDevice, int iSendEffectChain);
192            String GetSendEffectChainInfo(int iAudioOutputDevice, int iSendEffectChain);
193            String AppendSendEffectChainEffect(int iAudioOutputDevice, int iSendEffectChain, int iEffectInstance);
194            String InsertSendEffectChainEffect(int iAudioOutputDevice, int iSendEffectChain, int iEffectChainPosition, int iEffectInstance);
195            String RemoveSendEffectChainEffect(int iAudioOutputDevice, int iSendEffectChain, int iEffectChainPosition);
196    
197          String AddDbInstrumentDirectory(String Dir);          String AddDbInstrumentDirectory(String Dir);
198          String RemoveDbInstrumentDirectory(String Dir, bool Force = false);          String RemoveDbInstrumentDirectory(String Dir, bool Force = false);
199          String GetDbInstrumentDirectoryCount(String Dir, bool Recursive = false);          String GetDbInstrumentDirectoryCount(String Dir, bool Recursive = false);
# Line 169  class LSCPServer : public Thread { Line 204  class LSCPServer : public Thread {
204          String CopyDbInstrumentDirectory(String Dir, String Dst);          String CopyDbInstrumentDirectory(String Dir, String Dst);
205          String SetDbInstrumentDirectoryDescription(String Dir, String Desc);          String SetDbInstrumentDirectoryDescription(String Dir, String Desc);
206          String FindDbInstrumentDirectories(String Dir, std::map<String,String> Parameters, bool Recursive = true);          String FindDbInstrumentDirectories(String Dir, std::map<String,String> Parameters, bool Recursive = true);
207          String AddDbInstruments(String DbDir, String FilePath, int Index = -1);          String AddDbInstruments(String DbDir, String FilePath, int Index = -1, bool bBackground = false);
208          String AddDbInstrumentsFlat(String DbDir, String FilePath);          String AddDbInstruments(String ScanMode, String DbDir, String FsDir, bool bBackground = false, bool insDir = false);
         String AddDbInstrumentsNonrecursive(String DbDir, String FsDir);  
209          String RemoveDbInstrument(String Instr);          String RemoveDbInstrument(String Instr);
210          String GetDbInstrumentCount(String Dir, bool Recursive = false);          String GetDbInstrumentCount(String Dir, bool Recursive = false);
211          String GetDbInstruments(String Dir, bool Recursive = false);          String GetDbInstruments(String Dir, bool Recursive = false);
# Line 180  class LSCPServer : public Thread { Line 214  class LSCPServer : public Thread {
214          String MoveDbInstrument(String Instr, String Dst);          String MoveDbInstrument(String Instr, String Dst);
215          String CopyDbInstrument(String Instr, String Dst);          String CopyDbInstrument(String Instr, String Dst);
216          String SetDbInstrumentDescription(String Instr, String Desc);          String SetDbInstrumentDescription(String Instr, String Desc);
217            String SetDbInstrumentFilePath(String OldPath, String NewPath);
218            String FindLostDbInstrumentFiles();
219          String FindDbInstruments(String Dir, std::map<String,String> Parameters, bool Recursive = true);          String FindDbInstruments(String Dir, std::map<String,String> Parameters, bool Recursive = true);
220            String FormatInstrumentsDb();
221            String EditSamplerChannelInstrument(uint uiSamplerChannel);
222            String GetDbInstrumentsJobInfo(int JobId);
223          String ResetChannel(uint uiSamplerChannel);          String ResetChannel(uint uiSamplerChannel);
224          String ResetSampler();          String ResetSampler();
225          String GetServerInfo();          String GetServerInfo();
226            String GetTotalStreamCount();
227          String GetTotalVoiceCount();          String GetTotalVoiceCount();
228          String GetTotalVoiceCountMax();          String GetTotalVoiceCountMax();
229            String GetGlobalMaxVoices();
230            String SetGlobalMaxVoices(int iVoices);
231            String GetGlobalMaxStreams();
232            String SetGlobalMaxStreams(int iStreams);
233          String GetGlobalVolume();          String GetGlobalVolume();
234          String SetGlobalVolume(double dVolume);          String SetGlobalVolume(double dVolume);
235            String GetFileInstruments(String Filename);
236            String ListFileInstruments(String Filename);
237            String GetFileInstrumentInfo(String Filename, uint InstrumentID);
238            String SendChannelMidiData(String MidiMsg, uint uiSamplerChannel, uint Arg1, uint Arg2);
239          String SubscribeNotification(LSCPEvent::event_t);          String SubscribeNotification(LSCPEvent::event_t);
240          String UnsubscribeNotification(LSCPEvent::event_t);          String UnsubscribeNotification(LSCPEvent::event_t);
241          String SetEcho(yyparse_param_t* pSession, double boolean_value);          String SetEcho(yyparse_param_t* pSession, double boolean_value);
242          void   AnswerClient(String ReturnMessage);          void   AnswerClient(String ReturnMessage);
243            void   CloseAllConnections();
244    
245          static int currentSocket;          static int currentSocket;
246          static std::map<int,String> bufferedCommands;          static std::map<int,String> bufferedCommands;
247    
248          static void SendLSCPNotify( LSCPEvent Event );          static void SendLSCPNotify( LSCPEvent Event );
249          static int EventSubscribers( std::list<LSCPEvent::event_t> events );          static int EventSubscribers( std::list<LSCPEvent::event_t> events );
250          static void LockRTNotify( void ) { RTNotifyMutex.Lock(); }          static String FilterEndlines(String s);
251          static void UnlockRTNotify( void ) { RTNotifyMutex.Unlock(); }  
252      static String FilterEndlines(String s);          //Protect main thread that generates real time notify messages
253            //like voice count, stream count and buffer fill
254            //from LSCP server removing engines and channels from underneath
255            static Mutex RTNotifyMutex;
256    
257      protected:      protected:
258          int            hSocket;          int            hSocket;
# Line 233  class LSCPServer : public Thread { Line 285  class LSCPServer : public Thread {
285          void MuteNonSoloChannels();          void MuteNonSoloChannels();
286          void UnmuteChannels();          void UnmuteChannels();
287    
288            /**
289             * Throws an exception if the specified file is not found or
290             * if directory is specified.
291             */
292            static void VerifyFile(String Filename);
293    
294          static std::map<int,String> bufferedNotifies;          static std::map<int,String> bufferedNotifies;
295          static Mutex NotifyMutex;          static Mutex NotifyMutex;
296          static Mutex NotifyBufferMutex;          static Mutex NotifyBufferMutex;
# Line 243  class LSCPServer : public Thread { Line 301  class LSCPServer : public Thread {
301          static std::map< LSCPEvent::event_t, std::list<int> > eventSubscriptions;          static std::map< LSCPEvent::event_t, std::list<int> > eventSubscriptions;
302          static fd_set fdSet;          static fd_set fdSet;
303    
         //Protect main thread that generates real time notify messages  
         //like voice count, stream count and buffer fill  
         //from LSCP server removing engines and channels from underneath  
         static Mutex RTNotifyMutex;  
   
304          class EventHandler : public ChannelCountListener, public AudioDeviceCountListener,          class EventHandler : public ChannelCountListener, public AudioDeviceCountListener,
305              public MidiDeviceCountListener, public MidiInstrumentCountListener,              public MidiDeviceCountListener, public MidiInstrumentCountListener,
306              public MidiInstrumentInfoListener, public MidiInstrumentMapCountListener,              public MidiInstrumentInfoListener, public MidiInstrumentMapCountListener,
307              public MidiInstrumentMapInfoListener, public FxSendCountListener,              public MidiInstrumentMapInfoListener, public FxSendCountListener,
308              public VoiceCountListener, public StreamCountListener,              public VoiceCountListener, public StreamCountListener, public BufferFillListener,
309              public BufferFillListener, public TotalVoiceCountListener {              public TotalStreamCountListener, public TotalVoiceCountListener,
310                public EngineChangeListener, public MidiPortCountListener {
311    
312              public:              public:
313                    EventHandler(LSCPServer* pParent);
314    
315                  /**                  /**
316                   * Invoked when the number of sampler channels has changed.                   * Invoked when the number of sampler channels has changed.
317                   * @param NewCount The new number of sampler channels.                   * @param NewCount The new number of sampler channels.
318                   */                   */
319                  virtual void ChannelCountChanged(int NewCount);                  virtual void ChannelCountChanged(int NewCount);
320                            virtual void ChannelAdded(SamplerChannel* pChannel);
321                    virtual void ChannelToBeRemoved(SamplerChannel* pChannel);
322    
323                  /**                  /**
324                   * Invoked when the number of audio output devices has changed.                   * Invoked when the number of audio output devices has changed.
325                   * @param NewCount The new number of audio output devices.                   * @param NewCount The new number of audio output devices.
326                   */                   */
327                  virtual void AudioDeviceCountChanged(int NewCount);                  virtual void AudioDeviceCountChanged(int NewCount);
328    
329                  /**                  /**
330                   * Invoked when the number of MIDI input devices has changed.                   * Invoked when the number of MIDI input devices has changed.
331                   * @param NewCount The new number of MIDI input devices.                   * @param NewCount The new number of MIDI input devices.
# Line 275  class LSCPServer : public Thread { Line 333  class LSCPServer : public Thread {
333                  virtual void MidiDeviceCountChanged(int NewCount);                  virtual void MidiDeviceCountChanged(int NewCount);
334    
335                  /**                  /**
336                     * Invoked right before the supplied MIDI input device is going
337                     * to be destroyed.
338                     * @param pDevice MidiInputDevice to be deleted
339                     */
340                    virtual void MidiDeviceToBeDestroyed(MidiInputDevice* pDevice);
341    
342                    /**
343                     * Invoked to inform that a new MidiInputDevice has just been
344                     * created.
345                     * @param pDevice newly created MidiInputDevice
346                     */
347                    virtual void MidiDeviceCreated(MidiInputDevice* pDevice);
348    
349                    /**
350                     * Invoked when the number of MIDI input ports has changed.
351                     * @param NewCount The new number of MIDI input ports.
352                     */
353                    virtual void MidiPortCountChanged(int NewCount);
354    
355                    /**
356                     * Invoked right before the supplied MIDI input port is going
357                     * to be destroyed.
358                     * @param pPort MidiInputPort to be deleted
359                     */
360                    virtual void MidiPortToBeRemoved(MidiInputPort* pPort);
361    
362                    /**
363                     * Invoked to inform that a new MidiInputPort has just been
364                     * added.
365                     * @param pPort newly created MidiInputPort
366                     */
367                    virtual void MidiPortAdded(MidiInputPort* pPort);
368    
369                    /**
370                   * Invoked when the number of MIDI instruments has changed.                   * Invoked when the number of MIDI instruments has changed.
371                   * @param MapId The numerical ID of the MIDI instrument map.                   * @param MapId The numerical ID of the MIDI instrument map.
372                   * @param NewCount The new number of MIDI instruments.                   * @param NewCount The new number of MIDI instruments.
373                   */                   */
374                  virtual void MidiInstrumentCountChanged(int MapId, int NewCount);                  virtual void MidiInstrumentCountChanged(int MapId, int NewCount);
375    
376                  /**                  /**
377                   * Invoked when a MIDI instrument in a MIDI instrument map is changed.                   * Invoked when a MIDI instrument in a MIDI instrument map is changed.
378                   * @param MapId The numerical ID of the MIDI instrument map.                   * @param MapId The numerical ID of the MIDI instrument map.
# Line 288  class LSCPServer : public Thread { Line 380  class LSCPServer : public Thread {
380                   * @param Program The MIDI program number of the instrument.                   * @param Program The MIDI program number of the instrument.
381                   */                   */
382                  virtual void MidiInstrumentInfoChanged(int MapId, int Bank, int Program);                  virtual void MidiInstrumentInfoChanged(int MapId, int Bank, int Program);
383        
384                  /**                  /**
385                   * Invoked when the number of MIDI instrument maps has changed.                   * Invoked when the number of MIDI instrument maps has changed.
386                   * @param NewCount The new number of MIDI instruments.                   * @param NewCount The new number of MIDI instruments.
# Line 300  class LSCPServer : public Thread { Line 392  class LSCPServer : public Thread {
392                   * @param MapId The numerical ID of the MIDI instrument map.                   * @param MapId The numerical ID of the MIDI instrument map.
393                   */                   */
394                  virtual void MidiInstrumentMapInfoChanged(int MapId);                  virtual void MidiInstrumentMapInfoChanged(int MapId);
395          
396                  /**                  /**
397                   * Invoked when the number of effect sends                   * Invoked when the number of effect sends
398                   * on the specified sampler channel has changed.                   * on the specified sampler channel has changed.
# Line 338  class LSCPServer : public Thread { Line 430  class LSCPServer : public Thread {
430                   * @param NewCount The new number of active voices.                   * @param NewCount The new number of active voices.
431                   */                   */
432                  virtual void TotalVoiceCountChanged(int NewCount);                  virtual void TotalVoiceCountChanged(int NewCount);
433                    virtual void TotalStreamCountChanged(int NewCount);
434    
435                    virtual void EngineToBeChanged(int ChannelId);
436                    virtual void EngineChanged(int ChannelId);
437    
438                    virtual ~EventHandler();
439    
440                    struct midi_listener_entry {
441                        SamplerChannel* pSamplerChannel;
442                        EngineChannel* pEngineChannel;
443                        VirtualMidiDevice* pMidiListener;
444                    };
445    
446                    std::vector<midi_listener_entry> channelMidiListeners;
447    
448                    struct device_midi_listener_entry {
449                        MidiInputPort* pPort;
450                        VirtualMidiDevice* pMidiListener;
451                        uint uiDeviceID;
452                    };
453    
454                    std::vector<device_midi_listener_entry> deviceMidiListeners;
455    
456                private:
457                    LSCPServer* pParent;
458          } eventHandler;          } eventHandler;
459    
460  #if HAVE_SQLITE3  #if HAVE_SQLITE3
461          class DbInstrumentsEventHandler : public InstrumentsDb::Listener {          class DbInstrumentsEventHandler : public InstrumentsDb::Listener {
462              public:              public:
   
                 /**  
                  * Invoked when the number of instrument directories  
                  * in a specific directory has changed.  
                  * @param Dir The absolute pathname of the directory in  
                  * which the number of directories is changed.  
                  */  
463                  virtual void DirectoryCountChanged(String Dir);                  virtual void DirectoryCountChanged(String Dir);
   
                 /**  
                  * Invoked when the settings of an instrument directory  
                  * are changed.  
                  * @param Dir The absolute pathname of the directory  
                  * whose settings are changed.  
                  */  
464                  virtual void DirectoryInfoChanged(String Dir);                  virtual void DirectoryInfoChanged(String Dir);
   
                 /**  
                  * Invoked when an instrument directory is renamed.  
                  * @param Dir The old absolute pathname of the directory.  
                  * @param NewName The new name of the directory.  
                  */  
465                  virtual void DirectoryNameChanged(String Dir, String NewName);                  virtual void DirectoryNameChanged(String Dir, String NewName);
   
                 /**  
                  * Invoked when the number of instruments  
                  * in a specific directory has changed.  
                  * @param Dir The absolute pathname of the directory in  
                  * which the number of instruments is changed.  
                  */  
466                  virtual void InstrumentCountChanged(String Dir);                  virtual void InstrumentCountChanged(String Dir);
   
                 /**  
                  * Invoked when the settings of an instrument are changed.  
                  * @param Instr The absolute pathname of the instrument  
                  * whose settings are changed.  
                  */  
467                  virtual void InstrumentInfoChanged(String Instr);                  virtual void InstrumentInfoChanged(String Instr);
   
                 /**  
                  * Invoked when an instrument is renamed.  
                  * @param Instr The old absolute pathname of the instrument.  
                  * @param NewName The new name of the directory.  
                  */  
468                  virtual void InstrumentNameChanged(String Instr, String NewName);                  virtual void InstrumentNameChanged(String Instr, String NewName);
469                    virtual void JobStatusChanged(int JobId);
470          } dbInstrumentsEventHandler;          } dbInstrumentsEventHandler;
471  #endif // HAVE_SQLITE3  #endif // HAVE_SQLITE3
472  };  };
473    
474    }
475    
476  #endif // __LSCPSERVER_H_  #endif // __LSCPSERVER_H_

Legend:
Removed from v.1187  
changed lines
  Added in v.2500

  ViewVC Help
Powered by ViewVC