/[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 411 - (show annotations) (download) (as text)
Sat Feb 26 02:01:14 2005 UTC (19 years, 1 month ago) by schoenebeck
File MIME type: text/x-c++hdr
File size: 8826 byte(s)
* design change: using now one sampler engine instance and one disk thread
  instance for all sampler channels that are connected to the same audio
  output device (and are using the same engine type of course)
* added EngineFactory / EngineChannelFactory to remove the annoying build
  dependencies e.g. of the lscpserver to the actual sampler engine
  implementations
* bumped version to 0.3.0 (current CVS state is still quite broken,
  previous, stable CVS version was tagged as "v0_2_0" and is also available
  as source tarball)

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_PORT 8888
51
52 /// try up to 3 minutes to bind server socket
53 #define LSCP_SERVER_BIND_TIMEOUT 180
54
55 using namespace LinuxSampler;
56
57 // External references to the main scanner and parser functions
58 extern int yyparse(void* YYPARSE_PARAM);
59 extern void restart(yyparse_param_t* pparam, int& yychar);
60
61 /**
62 * Network server for the LinuxSampler Control Protocol (LSCP).
63 */
64 class LSCPServer : public Thread {
65 public:
66 LSCPServer(Sampler* pSampler);
67 int WaitUntilInitialized(long TimeoutSeconds = 0L, long TimeoutNanoSeconds = 0L);
68
69 // Methods called by the parser
70 String DestroyAudioOutputDevice(uint DeviceIndex);
71 String DestroyMidiInputDevice(uint DeviceIndex);
72 String LoadInstrument(String Filename, uint uiInstrument, uint uiSamplerChannel, bool bBackground = false);
73 String SetEngineType(String EngineName, uint uiSamplerChannel);
74 String GetChannels();
75 String ListChannels();
76 String AddChannel();
77 String RemoveChannel(uint uiSamplerChannel);
78 String GetAvailableEngines();
79 String GetEngineInfo(String EngineName);
80 String GetChannelInfo(uint uiSamplerChannel);
81 String GetVoiceCount(uint uiSamplerChannel);
82 String GetStreamCount(uint uiSamplerChannel);
83 String GetBufferFill(fill_response_t ResponseType, uint uiSamplerChannel);
84 String GetAvailableAudioOutputDrivers();
85 String GetAvailableMidiInputDrivers();
86 String GetAudioOutputDriverInfo(String Driver);
87 String GetMidiInputDriverInfo(String Driver);
88 #ifdef __GNUC__
89 typedef std::map<String,String> StringMap; // nasty workaround for a GCC bug (see GCC bug #15980, #57)
90 String GetAudioOutputDriverParameterInfo(String Driver, String Parameter, std::map<String,String> DependencyList = StringMap());
91 String GetMidiInputDriverParameterInfo(String Driver, String Parameter, std::map<String,String> DependencyList = StringMap());
92 String CreateAudioOutputDevice(String Driver, std::map<String,String> Parameters = StringMap());
93 String CreateMidiInputDevice(String Driver, std::map<String,String> Parameters = StringMap());
94 #else
95 String GetAudioOutputDriverParameterInfo(String Driver, String Parameter, std::map<String,String> DependencyList = std::map<String,String>());
96 String GetMidiInputDriverParameterInfo(String Driver, String Parameter, std::map<String,String> DependencyList = std::map<String,String>());
97 String CreateAudioOutputDevice(String Driver, std::map<String,String> Parameters = std::map<String,String>());
98 String CreateMidiInputDevice(String Driver, std::map<String,String> Parameters = std::map<String,String>());
99 #endif // __GNUC__
100 String GetAudioOutputDeviceCount();
101 String GetMidiInputDeviceCount();
102 String GetAudioOutputDevices();
103 String GetMidiInputDevices();
104 String GetAudioOutputDeviceInfo(uint DeviceIndex);
105 String GetMidiInputDeviceInfo(uint DeviceIndex);
106 String GetMidiInputPortInfo(uint DeviceIndex, uint PortIndex);
107 String GetMidiInputPortParameterInfo(uint DeviceId, uint PortId, String ParameterName);
108 String GetAudioOutputChannelInfo(uint DeviceId, uint ChannelId);
109 String GetAudioOutputChannelParameterInfo(uint DeviceId, uint ChannelId, String ParameterName);
110 String SetAudioOutputChannelParameter(uint DeviceId, uint ChannelId, String ParamKey, String ParamVal);
111 String SetAudioOutputDeviceParameter(uint DeviceIndex, String ParamKey, String ParamVal);
112 String SetMidiInputDeviceParameter(uint DeviceIndex, String ParamKey, String ParamVal);
113 String SetMidiInputPortParameter(uint DeviceIndex, uint PortIndex, String ParamKey, String ParamVal);
114 String SetAudioOutputChannel(uint ChannelAudioOutputChannel, uint AudioOutputDeviceInputChannel, uint uiSamplerChannel);
115 String SetAudioOutputDevice(uint AudioDeviceId, uint SamplerChannel);
116 String SetAudioOutputType(String AudioOutputDriver, uint uiSamplerChannel);
117 String SetMIDIInputPort(uint MIDIPort, uint uiSamplerChannel);
118 String SetMIDIInputChannel(uint MIDIChannel, uint uiSamplerChannel);
119 String SetMIDIInputDevice(uint MIDIDeviceId, uint uiSamplerChannel);
120 String SetMIDIInputType(String MidiInputDriver, uint uiSamplerChannel);
121 String SetMIDIInput(uint MIDIDeviceId, uint MIDIPort, uint MIDIChannel, uint uiSamplerChannel);
122 String SetVolume(double dVolume, uint uiSamplerChannel);
123 String ResetChannel(uint uiSamplerChannel);
124 String ResetSampler();
125 String SubscribeNotification(LSCPEvent::event_t);
126 String UnsubscribeNotification(LSCPEvent::event_t);
127 String QueryDatabase(String query);
128 String SetEcho(yyparse_param_t* pSession, double boolean_value);
129 void AnswerClient(String ReturnMessage);
130
131 static int currentSocket;
132 static std::map<int,String> bufferedCommands;
133
134 static void SendLSCPNotify( LSCPEvent Event );
135 static int EventSubscribers( std::list<LSCPEvent::event_t> events );
136 static void LockRTNotify( void ) { RTNotifyMutex.Lock(); }
137 static void UnlockRTNotify( void ) { RTNotifyMutex.Unlock(); }
138
139 protected:
140 int hSocket;
141 sockaddr_in SocketAddress;
142 Sampler* pSampler;
143 Condition Initialized;
144 LSCPInstrumentLoader InstrumentLoader; ///< thread responsible for loading instruments in the background
145
146 int Main(); ///< Implementation of virtual method from class Thread
147
148 private:
149
150 /**
151 * Find a created audio output device index.
152 */
153 int GetAudioOutputDeviceIndex (AudioOutputDevice *pDevice);
154
155 /**
156 * Find a created midi input device index.
157 */
158 int GetMidiInputDeviceIndex (MidiInputDevice *pDevice);
159
160 static std::map<int,String> bufferedNotifies;
161 static Mutex NotifyMutex;
162 static Mutex NotifyBufferMutex;
163 static bool GetLSCPCommand( std::vector<yyparse_param_t>::iterator iter );
164 static void CloseConnection( std::vector<yyparse_param_t>::iterator iter );
165 static std::vector<yyparse_param_t> Sessions;
166 static Mutex SubscriptionMutex;
167 static std::map< LSCPEvent::event_t, std::list<int> > eventSubscriptions;
168 static fd_set fdSet;
169
170 //Protect main thread that generates real time notify messages
171 //like voice count, stream count and buffer fill
172 //from LSCP server removing engines and channels from underneath
173 static Mutex RTNotifyMutex;
174 };
175
176 #endif // __LSCPSERVER_H_

  ViewVC Help
Powered by ViewVC