/[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 973 - (show annotations) (download) (as text)
Fri Dec 15 21:40:27 2006 UTC (17 years, 4 months ago) by schoenebeck
File MIME type: text/x-c++hdr
File size: 10457 byte(s)
* revised and extended MIDI instrument mapping feature to allow managing
  arbitrary amount of maps and assigning each sampler channel individually
  to one map (this commit batch includes LSCP spec document update and
  respective implementation on LS side)

1 /***************************************************************************
2 * *
3 * LinuxSampler - modular, streaming capable sampler *
4 * *
5 * Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck *
6 * Copyright (C) 2005, 2006 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 "../Sampler.h"
44 #include "../common/Thread.h"
45 #include "../common/Mutex.h"
46 #include "../common/Condition.h"
47
48 #include "../drivers/midi/MidiInstrumentMapper.h"
49
50 /// TCP Port on which the server should listen for connection requests.
51 #define LSCP_ADDR INADDR_ANY
52 #define LSCP_PORT 8888
53
54 /// try up to 3 minutes to bind server socket
55 #define LSCP_SERVER_BIND_TIMEOUT 180
56
57 using namespace LinuxSampler;
58
59 // External references to the main scanner and parser functions
60 extern int yyparse(void* YYPARSE_PARAM);
61 extern void restart(yyparse_param_t* pparam, int& yychar);
62
63 /**
64 * Network server for the LinuxSampler Control Protocol (LSCP).
65 */
66 class LSCPServer : public Thread {
67 public:
68 LSCPServer(Sampler* pSampler, long int addr, short int port);
69 virtual ~LSCPServer();
70 int WaitUntilInitialized(long TimeoutSeconds = 0L, long TimeoutNanoSeconds = 0L);
71
72 // Methods called by the parser
73 String DestroyAudioOutputDevice(uint DeviceIndex);
74 String DestroyMidiInputDevice(uint DeviceIndex);
75 String LoadInstrument(String Filename, uint uiInstrument, uint uiSamplerChannel, bool bBackground = false);
76 String SetEngineType(String EngineName, uint uiSamplerChannel);
77 String GetChannels();
78 String ListChannels();
79 String AddChannel();
80 String RemoveChannel(uint uiSamplerChannel);
81 String GetAvailableEngines();
82 String ListAvailableEngines();
83 String GetEngineInfo(String EngineName);
84 String GetChannelInfo(uint uiSamplerChannel);
85 String GetVoiceCount(uint uiSamplerChannel);
86 String GetStreamCount(uint uiSamplerChannel);
87 String GetBufferFill(fill_response_t ResponseType, uint uiSamplerChannel);
88 String GetAvailableAudioOutputDrivers();
89 String ListAvailableAudioOutputDrivers();
90 String GetAvailableMidiInputDrivers();
91 String ListAvailableMidiInputDrivers();
92 String GetAudioOutputDriverInfo(String Driver);
93 String GetMidiInputDriverInfo(String Driver);
94 #ifdef __GNUC__
95 typedef std::map<String,String> StringMap; // nasty workaround for a GCC bug (see GCC bug #15980, #57)
96 String GetAudioOutputDriverParameterInfo(String Driver, String Parameter, std::map<String,String> DependencyList = StringMap());
97 String GetMidiInputDriverParameterInfo(String Driver, String Parameter, std::map<String,String> DependencyList = StringMap());
98 String CreateAudioOutputDevice(String Driver, std::map<String,String> Parameters = StringMap());
99 String CreateMidiInputDevice(String Driver, std::map<String,String> Parameters = StringMap());
100 #else
101 String GetAudioOutputDriverParameterInfo(String Driver, String Parameter, std::map<String,String> DependencyList = std::map<String,String>());
102 String GetMidiInputDriverParameterInfo(String Driver, String Parameter, std::map<String,String> DependencyList = std::map<String,String>());
103 String CreateAudioOutputDevice(String Driver, std::map<String,String> Parameters = std::map<String,String>());
104 String CreateMidiInputDevice(String Driver, std::map<String,String> Parameters = std::map<String,String>());
105 #endif // __GNUC__
106 String GetAudioOutputDeviceCount();
107 String GetMidiInputDeviceCount();
108 String GetAudioOutputDevices();
109 String GetMidiInputDevices();
110 String GetAudioOutputDeviceInfo(uint DeviceIndex);
111 String GetMidiInputDeviceInfo(uint DeviceIndex);
112 String GetMidiInputPortInfo(uint DeviceIndex, uint PortIndex);
113 String GetMidiInputPortParameterInfo(uint DeviceId, uint PortId, String ParameterName);
114 String GetAudioOutputChannelInfo(uint DeviceId, uint ChannelId);
115 String GetAudioOutputChannelParameterInfo(uint DeviceId, uint ChannelId, String ParameterName);
116 String SetAudioOutputChannelParameter(uint DeviceId, uint ChannelId, String ParamKey, String ParamVal);
117 String SetAudioOutputDeviceParameter(uint DeviceIndex, String ParamKey, String ParamVal);
118 String SetMidiInputDeviceParameter(uint DeviceIndex, String ParamKey, String ParamVal);
119 String SetMidiInputPortParameter(uint DeviceIndex, uint PortIndex, String ParamKey, String ParamVal);
120 String SetAudioOutputChannel(uint ChannelAudioOutputChannel, uint AudioOutputDeviceInputChannel, uint uiSamplerChannel);
121 String SetAudioOutputDevice(uint AudioDeviceId, uint SamplerChannel);
122 String SetAudioOutputType(String AudioOutputDriver, uint uiSamplerChannel);
123 String SetMIDIInputPort(uint MIDIPort, uint uiSamplerChannel);
124 String SetMIDIInputChannel(uint MIDIChannel, uint uiSamplerChannel);
125 String SetMIDIInputDevice(uint MIDIDeviceId, uint uiSamplerChannel);
126 String SetMIDIInputType(String MidiInputDriver, uint uiSamplerChannel);
127 String SetMIDIInput(uint MIDIDeviceId, uint MIDIPort, uint MIDIChannel, uint uiSamplerChannel);
128 String SetVolume(double dVolume, uint uiSamplerChannel);
129 String SetChannelMute(bool bMute, uint uiSamplerChannel);
130 String SetChannelSolo(bool bSolo, uint uiSamplerChannel);
131 String AddOrReplaceMIDIInstrumentMapping(uint MidiMapID, uint MidiBank, uint MidiProg, String EngineType, String InstrumentFile, uint InstrumentIndex, float Volume, MidiInstrumentMapper::mode_t LoadMode, String Name);
132 String RemoveMIDIInstrumentMapping(uint MidiMapID, uint MidiBank, uint MidiProg);
133 String GetMidiInstrumentMappings(uint MidiMapID);
134 String GetAllMidiInstrumentMappings();
135 String GetMidiInstrumentMapping(uint MidiMapID, uint MidiBank, uint MidiProg);
136 String ListMidiInstrumentMappings(uint MidiMapID);
137 String ListAllMidiInstrumentMappings();
138 String ClearMidiInstrumentMappings(uint MidiMapID);
139 String ClearAllMidiInstrumentMappings();
140 String AddMidiInstrumentMap(String MapName = "");
141 String RemoveMidiInstrumentMap(uint MidiMapID);
142 String RemoveAllMidiInstrumentMaps();
143 String GetMidiInstrumentMaps();
144 String ListMidiInstrumentMaps();
145 String GetMidiInstrumentMap(uint MidiMapID);
146 String SetMidiInstrumentMapName(uint MidiMapID, String NewName);
147 String SetChannelMap(uint uiSamplerChannel, int MidiMapID);
148 String ResetChannel(uint uiSamplerChannel);
149 String ResetSampler();
150 String GetServerInfo();
151 String GetTotalVoiceCount();
152 String GetTotalVoiceCountMax();
153 String SubscribeNotification(LSCPEvent::event_t);
154 String UnsubscribeNotification(LSCPEvent::event_t);
155 String QueryDatabase(String query);
156 String SetEcho(yyparse_param_t* pSession, double boolean_value);
157 void AnswerClient(String ReturnMessage);
158
159 static int currentSocket;
160 static std::map<int,String> bufferedCommands;
161
162 static void SendLSCPNotify( LSCPEvent Event );
163 static int EventSubscribers( std::list<LSCPEvent::event_t> events );
164 static void LockRTNotify( void ) { RTNotifyMutex.Lock(); }
165 static void UnlockRTNotify( void ) { RTNotifyMutex.Unlock(); }
166
167 protected:
168 int hSocket;
169 sockaddr_in SocketAddress;
170 Sampler* pSampler;
171 Condition Initialized;
172
173 int Main(); ///< Implementation of virtual method from class Thread
174
175 private:
176
177 /**
178 * Find a created audio output device index.
179 */
180 int GetAudioOutputDeviceIndex (AudioOutputDevice *pDevice);
181
182 /**
183 * Find a created midi input device index.
184 */
185 int GetMidiInputDeviceIndex (MidiInputDevice *pDevice);
186
187 bool HasSoloChannel();
188 void MuteNonSoloChannels();
189 void UnmuteChannels();
190
191 static std::map<int,String> bufferedNotifies;
192 static Mutex NotifyMutex;
193 static Mutex NotifyBufferMutex;
194 static bool GetLSCPCommand( std::vector<yyparse_param_t>::iterator iter );
195 static void CloseConnection( std::vector<yyparse_param_t>::iterator iter );
196 static std::vector<yyparse_param_t> Sessions;
197 static Mutex SubscriptionMutex;
198 static std::map< LSCPEvent::event_t, std::list<int> > eventSubscriptions;
199 static fd_set fdSet;
200
201 //Protect main thread that generates real time notify messages
202 //like voice count, stream count and buffer fill
203 //from LSCP server removing engines and channels from underneath
204 static Mutex RTNotifyMutex;
205 };
206
207 #endif // __LSCPSERVER_H_

  ViewVC Help
Powered by ViewVC