/[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 705 - (show annotations) (download) (as text)
Wed Jul 20 21:43:23 2005 UTC (16 years ago) by schoenebeck
File MIME type: text/x-c++hdr
File size: 9317 byte(s)
* support for muting sampler channels and solo mode of the same, two new
  LSCP commands ("SET CHANNEL MUTE" and "SET CHANNEL SOLO") and two new
  fields ("MUTE" and "SOLO") for command "GET CHANNEL INFO" were
  introduced for this (patch by Grigor Iliev, 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 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 #include <unistd.h>
28 #include <sys/types.h>
29 #include <sys/socket.h>
30 #include <sys/select.h>
31 #include <sys/time.h>
32 #include <netinet/in.h>
33 #include <netinet/tcp.h>
34 #include <arpa/inet.h>
35 #include <netdb.h>
36
37 #include <list>
38
39 #include "lscp.h"
40 #include "lscpparser.h"
41 #include "lscp.h"
42 #include "lscpevent.h"
43 #include "lscpinstrumentloader.h"
44 #include "../Sampler.h"
45 #include "../common/Thread.h"
46 #include "../common/Mutex.h"
47 #include "../common/Condition.h"
48
49 /// TCP Port on which the server should listen for connection requests.
50 #define LSCP_ADDR INADDR_ANY
51 #define LSCP_PORT 8888
52
53 /// try up to 3 minutes to bind server socket
54 #define LSCP_SERVER_BIND_TIMEOUT 180
55
56 using namespace LinuxSampler;
57
58 // External references to the main scanner and parser functions
59 extern int yyparse(void* YYPARSE_PARAM);
60 extern void restart(yyparse_param_t* pparam, int& yychar);
61
62 /**
63 * Network server for the LinuxSampler Control Protocol (LSCP).
64 */
65 class LSCPServer : public Thread {
66 public:
67 LSCPServer(Sampler* pSampler, long int addr, short int port);
68 virtual ~LSCPServer();
69 int WaitUntilInitialized(long TimeoutSeconds = 0L, long TimeoutNanoSeconds = 0L);
70
71 // Methods called by the parser
72 String DestroyAudioOutputDevice(uint DeviceIndex);
73 String DestroyMidiInputDevice(uint DeviceIndex);
74 String LoadInstrument(String Filename, uint uiInstrument, uint uiSamplerChannel, bool bBackground = false);
75 String SetEngineType(String EngineName, uint uiSamplerChannel);
76 String GetChannels();
77 String ListChannels();
78 String AddChannel();
79 String RemoveChannel(uint uiSamplerChannel);
80 String GetAvailableEngines();
81 String ListAvailableEngines();
82 String GetEngineInfo(String EngineName);
83 String GetChannelInfo(uint uiSamplerChannel);
84 String GetVoiceCount(uint uiSamplerChannel);
85 String GetStreamCount(uint uiSamplerChannel);
86 String GetBufferFill(fill_response_t ResponseType, uint uiSamplerChannel);
87 String GetAvailableAudioOutputDrivers();
88 String ListAvailableAudioOutputDrivers();
89 String GetAvailableMidiInputDrivers();
90 String ListAvailableMidiInputDrivers();
91 String GetAudioOutputDriverInfo(String Driver);
92 String GetMidiInputDriverInfo(String Driver);
93 #ifdef __GNUC__
94 typedef std::map<String,String> StringMap; // nasty workaround for a GCC bug (see GCC bug #15980, #57)
95 String GetAudioOutputDriverParameterInfo(String Driver, String Parameter, std::map<String,String> DependencyList = StringMap());
96 String GetMidiInputDriverParameterInfo(String Driver, String Parameter, std::map<String,String> DependencyList = StringMap());
97 String CreateAudioOutputDevice(String Driver, std::map<String,String> Parameters = StringMap());
98 String CreateMidiInputDevice(String Driver, std::map<String,String> Parameters = StringMap());
99 #else
100 String GetAudioOutputDriverParameterInfo(String Driver, String Parameter, std::map<String,String> DependencyList = std::map<String,String>());
101 String GetMidiInputDriverParameterInfo(String Driver, String Parameter, std::map<String,String> DependencyList = std::map<String,String>());
102 String CreateAudioOutputDevice(String Driver, std::map<String,String> Parameters = std::map<String,String>());
103 String CreateMidiInputDevice(String Driver, std::map<String,String> Parameters = std::map<String,String>());
104 #endif // __GNUC__
105 String GetAudioOutputDeviceCount();
106 String GetMidiInputDeviceCount();
107 String GetAudioOutputDevices();
108 String GetMidiInputDevices();
109 String GetAudioOutputDeviceInfo(uint DeviceIndex);
110 String GetMidiInputDeviceInfo(uint DeviceIndex);
111 String GetMidiInputPortInfo(uint DeviceIndex, uint PortIndex);
112 String GetMidiInputPortParameterInfo(uint DeviceId, uint PortId, String ParameterName);
113 String GetAudioOutputChannelInfo(uint DeviceId, uint ChannelId);
114 String GetAudioOutputChannelParameterInfo(uint DeviceId, uint ChannelId, String ParameterName);
115 String SetAudioOutputChannelParameter(uint DeviceId, uint ChannelId, String ParamKey, String ParamVal);
116 String SetAudioOutputDeviceParameter(uint DeviceIndex, String ParamKey, String ParamVal);
117 String SetMidiInputDeviceParameter(uint DeviceIndex, String ParamKey, String ParamVal);
118 String SetMidiInputPortParameter(uint DeviceIndex, uint PortIndex, String ParamKey, String ParamVal);
119 String SetAudioOutputChannel(uint ChannelAudioOutputChannel, uint AudioOutputDeviceInputChannel, uint uiSamplerChannel);
120 String SetAudioOutputDevice(uint AudioDeviceId, uint SamplerChannel);
121 String SetAudioOutputType(String AudioOutputDriver, uint uiSamplerChannel);
122 String SetMIDIInputPort(uint MIDIPort, uint uiSamplerChannel);
123 String SetMIDIInputChannel(uint MIDIChannel, uint uiSamplerChannel);
124 String SetMIDIInputDevice(uint MIDIDeviceId, uint uiSamplerChannel);
125 String SetMIDIInputType(String MidiInputDriver, uint uiSamplerChannel);
126 String SetMIDIInput(uint MIDIDeviceId, uint MIDIPort, uint MIDIChannel, uint uiSamplerChannel);
127 String SetVolume(double dVolume, uint uiSamplerChannel);
128 String SetChannelMute(bool bMute, uint uiSamplerChannel);
129 String SetChannelSolo(bool bSolo, uint uiSamplerChannel);
130 String ResetChannel(uint uiSamplerChannel);
131 String ResetSampler();
132 String GetServerInfo();
133 String SubscribeNotification(LSCPEvent::event_t);
134 String UnsubscribeNotification(LSCPEvent::event_t);
135 String QueryDatabase(String query);
136 String SetEcho(yyparse_param_t* pSession, double boolean_value);
137 void AnswerClient(String ReturnMessage);
138
139 static int currentSocket;
140 static std::map<int,String> bufferedCommands;
141
142 static void SendLSCPNotify( LSCPEvent Event );
143 static int EventSubscribers( std::list<LSCPEvent::event_t> events );
144 static void LockRTNotify( void ) { RTNotifyMutex.Lock(); }
145 static void UnlockRTNotify( void ) { RTNotifyMutex.Unlock(); }
146
147 protected:
148 int hSocket;
149 sockaddr_in SocketAddress;
150 Sampler* pSampler;
151 Condition Initialized;
152 LSCPInstrumentLoader InstrumentLoader; ///< thread responsible for loading instruments in the background
153
154 int Main(); ///< Implementation of virtual method from class Thread
155
156 private:
157
158 /**
159 * Find a created audio output device index.
160 */
161 int GetAudioOutputDeviceIndex (AudioOutputDevice *pDevice);
162
163 /**
164 * Find a created midi input device index.
165 */
166 int GetMidiInputDeviceIndex (MidiInputDevice *pDevice);
167
168 bool HasSoloChannel();
169 void MuteNonSoloChannels();
170 void UnmuteChannels();
171
172 static std::map<int,String> bufferedNotifies;
173 static Mutex NotifyMutex;
174 static Mutex NotifyBufferMutex;
175 static bool GetLSCPCommand( std::vector<yyparse_param_t>::iterator iter );
176 static void CloseConnection( std::vector<yyparse_param_t>::iterator iter );
177 static std::vector<yyparse_param_t> Sessions;
178 static Mutex SubscriptionMutex;
179 static std::map< LSCPEvent::event_t, std::list<int> > eventSubscriptions;
180 static fd_set fdSet;
181
182 //Protect main thread that generates real time notify messages
183 //like voice count, stream count and buffer fill
184 //from LSCP server removing engines and channels from underneath
185 static Mutex RTNotifyMutex;
186 };
187
188 #endif // __LSCPSERVER_H_

  ViewVC Help
Powered by ViewVC