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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 973 - (hide 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 schoenebeck 35 /***************************************************************************
2     * *
3     * LinuxSampler - modular, streaming capable sampler *
4     * *
5 schoenebeck 56 * Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck *
6 schoenebeck 947 * Copyright (C) 2005, 2006 Christian Schoenebeck *
7 schoenebeck 35 * *
8 schoenebeck 385 * This library is free software; you can redistribute it and/or modify *
9 schoenebeck 35 * 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 schoenebeck 385 * This library is distributed in the hope that it will be useful, *
14 schoenebeck 35 * 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 schoenebeck 385 * along with this library; if not, write to the Free Software *
20 schoenebeck 35 * 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 senkov 170 #include <sys/select.h>
31     #include <sys/time.h>
32 schoenebeck 35 #include <netinet/in.h>
33     #include <netinet/tcp.h>
34     #include <arpa/inet.h>
35     #include <netdb.h>
36    
37 senkov 170 #include <list>
38    
39 schoenebeck 53 #include "lscp.h"
40 schoenebeck 35 #include "lscpparser.h"
41 senkov 170 #include "lscp.h"
42     #include "lscpevent.h"
43 schoenebeck 53 #include "../Sampler.h"
44     #include "../common/Thread.h"
45 senkov 170 #include "../common/Mutex.h"
46 schoenebeck 211 #include "../common/Condition.h"
47 schoenebeck 35
48 schoenebeck 947 #include "../drivers/midi/MidiInstrumentMapper.h"
49    
50 schoenebeck 35 /// TCP Port on which the server should listen for connection requests.
51 senkov 667 #define LSCP_ADDR INADDR_ANY
52 schoenebeck 35 #define LSCP_PORT 8888
53    
54 schoenebeck 227 /// try up to 3 minutes to bind server socket
55     #define LSCP_SERVER_BIND_TIMEOUT 180
56    
57 schoenebeck 53 using namespace LinuxSampler;
58    
59 schoenebeck 35 // External references to the main scanner and parser functions
60     extern int yyparse(void* YYPARSE_PARAM);
61 schoenebeck 219 extern void restart(yyparse_param_t* pparam, int& yychar);
62 schoenebeck 35
63     /**
64     * Network server for the LinuxSampler Control Protocol (LSCP).
65     */
66     class LSCPServer : public Thread {
67     public:
68 senkov 667 LSCPServer(Sampler* pSampler, long int addr, short int port);
69 schoenebeck 475 virtual ~LSCPServer();
70 schoenebeck 211 int WaitUntilInitialized(long TimeoutSeconds = 0L, long TimeoutNanoSeconds = 0L);
71 schoenebeck 35
72     // Methods called by the parser
73 schoenebeck 123 String DestroyAudioOutputDevice(uint DeviceIndex);
74 senkov 155 String DestroyMidiInputDevice(uint DeviceIndex);
75 capela 137 String LoadInstrument(String Filename, uint uiInstrument, uint uiSamplerChannel, bool bBackground = false);
76 schoenebeck 411 String SetEngineType(String EngineName, uint uiSamplerChannel);
77 schoenebeck 35 String GetChannels();
78 schoenebeck 209 String ListChannels();
79 schoenebeck 35 String AddChannel();
80 schoenebeck 53 String RemoveChannel(uint uiSamplerChannel);
81 schoenebeck 35 String GetAvailableEngines();
82 capela 527 String ListAvailableEngines();
83 schoenebeck 35 String GetEngineInfo(String EngineName);
84 schoenebeck 53 String GetChannelInfo(uint uiSamplerChannel);
85     String GetVoiceCount(uint uiSamplerChannel);
86     String GetStreamCount(uint uiSamplerChannel);
87     String GetBufferFill(fill_response_t ResponseType, uint uiSamplerChannel);
88 schoenebeck 123 String GetAvailableAudioOutputDrivers();
89 capela 527 String ListAvailableAudioOutputDrivers();
90 senkov 155 String GetAvailableMidiInputDrivers();
91 capela 527 String ListAvailableMidiInputDrivers();
92 schoenebeck 123 String GetAudioOutputDriverInfo(String Driver);
93 senkov 155 String GetMidiInputDriverInfo(String Driver);
94 schoenebeck 123 #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 senkov 155 String GetMidiInputDriverParameterInfo(String Driver, String Parameter, std::map<String,String> DependencyList = StringMap());
98 senkov 140 String CreateAudioOutputDevice(String Driver, std::map<String,String> Parameters = StringMap());
99 senkov 155 String CreateMidiInputDevice(String Driver, std::map<String,String> Parameters = StringMap());
100 schoenebeck 123 #else
101     String GetAudioOutputDriverParameterInfo(String Driver, String Parameter, std::map<String,String> DependencyList = std::map<String,String>());
102 senkov 155 String GetMidiInputDriverParameterInfo(String Driver, String Parameter, std::map<String,String> DependencyList = std::map<String,String>());
103 senkov 140 String CreateAudioOutputDevice(String Driver, std::map<String,String> Parameters = std::map<String,String>());
104 senkov 155 String CreateMidiInputDevice(String Driver, std::map<String,String> Parameters = std::map<String,String>());
105 schoenebeck 123 #endif // __GNUC__
106     String GetAudioOutputDeviceCount();
107 senkov 155 String GetMidiInputDeviceCount();
108 schoenebeck 123 String GetAudioOutputDevices();
109 senkov 155 String GetMidiInputDevices();
110 schoenebeck 123 String GetAudioOutputDeviceInfo(uint DeviceIndex);
111 senkov 155 String GetMidiInputDeviceInfo(uint DeviceIndex);
112     String GetMidiInputPortInfo(uint DeviceIndex, uint PortIndex);
113 senkov 185 String GetMidiInputPortParameterInfo(uint DeviceId, uint PortId, String ParameterName);
114 schoenebeck 123 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 senkov 155 String SetMidiInputDeviceParameter(uint DeviceIndex, String ParamKey, String ParamVal);
119 capela 159 String SetMidiInputPortParameter(uint DeviceIndex, uint PortIndex, String ParamKey, String ParamVal);
120 schoenebeck 123 String SetAudioOutputChannel(uint ChannelAudioOutputChannel, uint AudioOutputDeviceInputChannel, uint uiSamplerChannel);
121 capela 159 String SetAudioOutputDevice(uint AudioDeviceId, uint SamplerChannel);
122 capela 143 String SetAudioOutputType(String AudioOutputDriver, uint uiSamplerChannel);
123 capela 159 String SetMIDIInputPort(uint MIDIPort, uint uiSamplerChannel);
124     String SetMIDIInputChannel(uint MIDIChannel, uint uiSamplerChannel);
125     String SetMIDIInputDevice(uint MIDIDeviceId, uint uiSamplerChannel);
126 schoenebeck 123 String SetMIDIInputType(String MidiInputDriver, uint uiSamplerChannel);
127 capela 159 String SetMIDIInput(uint MIDIDeviceId, uint MIDIPort, uint MIDIChannel, uint uiSamplerChannel);
128 schoenebeck 225 String SetVolume(double dVolume, uint uiSamplerChannel);
129 schoenebeck 705 String SetChannelMute(bool bMute, uint uiSamplerChannel);
130     String SetChannelSolo(bool bSolo, uint uiSamplerChannel);
131 schoenebeck 973 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 schoenebeck 53 String ResetChannel(uint uiSamplerChannel);
149 schoenebeck 212 String ResetSampler();
150 schoenebeck 563 String GetServerInfo();
151 iliev 778 String GetTotalVoiceCount();
152     String GetTotalVoiceCountMax();
153 senkov 170 String SubscribeNotification(LSCPEvent::event_t);
154     String UnsubscribeNotification(LSCPEvent::event_t);
155 senkov 397 String QueryDatabase(String query);
156 schoenebeck 210 String SetEcho(yyparse_param_t* pSession, double boolean_value);
157 schoenebeck 35 void AnswerClient(String ReturnMessage);
158 senkov 170
159     static int currentSocket;
160     static std::map<int,String> bufferedCommands;
161 senkov 184
162     static void SendLSCPNotify( LSCPEvent Event );
163 senkov 360 static int EventSubscribers( std::list<LSCPEvent::event_t> events );
164     static void LockRTNotify( void ) { RTNotifyMutex.Lock(); }
165     static void UnlockRTNotify( void ) { RTNotifyMutex.Unlock(); }
166 senkov 184
167 schoenebeck 35 protected:
168 schoenebeck 53 int hSocket;
169     sockaddr_in SocketAddress;
170     Sampler* pSampler;
171 schoenebeck 211 Condition Initialized;
172 schoenebeck 35
173     int Main(); ///< Implementation of virtual method from class Thread
174 senkov 170
175 schoenebeck 35 private:
176 schoenebeck 209
177 schoenebeck 35 /**
178 capela 143 * Find a created audio output device index.
179     */
180     int GetAudioOutputDeviceIndex (AudioOutputDevice *pDevice);
181 schoenebeck 209
182 senkov 155 /**
183     * Find a created midi input device index.
184     */
185     int GetMidiInputDeviceIndex (MidiInputDevice *pDevice);
186 capela 143
187 schoenebeck 705 bool HasSoloChannel();
188     void MuteNonSoloChannels();
189     void UnmuteChannels();
190    
191 senkov 170 static std::map<int,String> bufferedNotifies;
192     static Mutex NotifyMutex;
193     static Mutex NotifyBufferMutex;
194 schoenebeck 210 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 senkov 170 static Mutex SubscriptionMutex;
198     static std::map< LSCPEvent::event_t, std::list<int> > eventSubscriptions;
199     static fd_set fdSet;
200 senkov 360
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 schoenebeck 35 };
206    
207     #endif // __LSCPSERVER_H_

  ViewVC Help
Powered by ViewVC