/[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 705 - (hide annotations) (download) (as text)
Wed Jul 20 21:43:23 2005 UTC (18 years, 9 months 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 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 385 * Copyright (C) 2005 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 385 #include "lscpinstrumentloader.h"
44 schoenebeck 53 #include "../Sampler.h"
45     #include "../common/Thread.h"
46 senkov 170 #include "../common/Mutex.h"
47 schoenebeck 211 #include "../common/Condition.h"
48 schoenebeck 35
49     /// TCP Port on which the server should listen for connection requests.
50 senkov 667 #define LSCP_ADDR INADDR_ANY
51 schoenebeck 35 #define LSCP_PORT 8888
52    
53 schoenebeck 227 /// try up to 3 minutes to bind server socket
54     #define LSCP_SERVER_BIND_TIMEOUT 180
55    
56 schoenebeck 53 using namespace LinuxSampler;
57    
58 schoenebeck 35 // External references to the main scanner and parser functions
59     extern int yyparse(void* YYPARSE_PARAM);
60 schoenebeck 219 extern void restart(yyparse_param_t* pparam, int& yychar);
61 schoenebeck 35
62     /**
63     * Network server for the LinuxSampler Control Protocol (LSCP).
64     */
65     class LSCPServer : public Thread {
66     public:
67 senkov 667 LSCPServer(Sampler* pSampler, long int addr, short int port);
68 schoenebeck 475 virtual ~LSCPServer();
69 schoenebeck 211 int WaitUntilInitialized(long TimeoutSeconds = 0L, long TimeoutNanoSeconds = 0L);
70 schoenebeck 35
71     // Methods called by the parser
72 schoenebeck 123 String DestroyAudioOutputDevice(uint DeviceIndex);
73 senkov 155 String DestroyMidiInputDevice(uint DeviceIndex);
74 capela 137 String LoadInstrument(String Filename, uint uiInstrument, uint uiSamplerChannel, bool bBackground = false);
75 schoenebeck 411 String SetEngineType(String EngineName, uint uiSamplerChannel);
76 schoenebeck 35 String GetChannels();
77 schoenebeck 209 String ListChannels();
78 schoenebeck 35 String AddChannel();
79 schoenebeck 53 String RemoveChannel(uint uiSamplerChannel);
80 schoenebeck 35 String GetAvailableEngines();
81 capela 527 String ListAvailableEngines();
82 schoenebeck 35 String GetEngineInfo(String EngineName);
83 schoenebeck 53 String GetChannelInfo(uint uiSamplerChannel);
84     String GetVoiceCount(uint uiSamplerChannel);
85     String GetStreamCount(uint uiSamplerChannel);
86     String GetBufferFill(fill_response_t ResponseType, uint uiSamplerChannel);
87 schoenebeck 123 String GetAvailableAudioOutputDrivers();
88 capela 527 String ListAvailableAudioOutputDrivers();
89 senkov 155 String GetAvailableMidiInputDrivers();
90 capela 527 String ListAvailableMidiInputDrivers();
91 schoenebeck 123 String GetAudioOutputDriverInfo(String Driver);
92 senkov 155 String GetMidiInputDriverInfo(String Driver);
93 schoenebeck 123 #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 senkov 155 String GetMidiInputDriverParameterInfo(String Driver, String Parameter, std::map<String,String> DependencyList = StringMap());
97 senkov 140 String CreateAudioOutputDevice(String Driver, std::map<String,String> Parameters = StringMap());
98 senkov 155 String CreateMidiInputDevice(String Driver, std::map<String,String> Parameters = StringMap());
99 schoenebeck 123 #else
100     String GetAudioOutputDriverParameterInfo(String Driver, String Parameter, std::map<String,String> DependencyList = std::map<String,String>());
101 senkov 155 String GetMidiInputDriverParameterInfo(String Driver, String Parameter, std::map<String,String> DependencyList = std::map<String,String>());
102 senkov 140 String CreateAudioOutputDevice(String Driver, std::map<String,String> Parameters = std::map<String,String>());
103 senkov 155 String CreateMidiInputDevice(String Driver, std::map<String,String> Parameters = std::map<String,String>());
104 schoenebeck 123 #endif // __GNUC__
105     String GetAudioOutputDeviceCount();
106 senkov 155 String GetMidiInputDeviceCount();
107 schoenebeck 123 String GetAudioOutputDevices();
108 senkov 155 String GetMidiInputDevices();
109 schoenebeck 123 String GetAudioOutputDeviceInfo(uint DeviceIndex);
110 senkov 155 String GetMidiInputDeviceInfo(uint DeviceIndex);
111     String GetMidiInputPortInfo(uint DeviceIndex, uint PortIndex);
112 senkov 185 String GetMidiInputPortParameterInfo(uint DeviceId, uint PortId, String ParameterName);
113 schoenebeck 123 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 senkov 155 String SetMidiInputDeviceParameter(uint DeviceIndex, String ParamKey, String ParamVal);
118 capela 159 String SetMidiInputPortParameter(uint DeviceIndex, uint PortIndex, String ParamKey, String ParamVal);
119 schoenebeck 123 String SetAudioOutputChannel(uint ChannelAudioOutputChannel, uint AudioOutputDeviceInputChannel, uint uiSamplerChannel);
120 capela 159 String SetAudioOutputDevice(uint AudioDeviceId, uint SamplerChannel);
121 capela 143 String SetAudioOutputType(String AudioOutputDriver, uint uiSamplerChannel);
122 capela 159 String SetMIDIInputPort(uint MIDIPort, uint uiSamplerChannel);
123     String SetMIDIInputChannel(uint MIDIChannel, uint uiSamplerChannel);
124     String SetMIDIInputDevice(uint MIDIDeviceId, uint uiSamplerChannel);
125 schoenebeck 123 String SetMIDIInputType(String MidiInputDriver, uint uiSamplerChannel);
126 capela 159 String SetMIDIInput(uint MIDIDeviceId, uint MIDIPort, uint MIDIChannel, uint uiSamplerChannel);
127 schoenebeck 225 String SetVolume(double dVolume, uint uiSamplerChannel);
128 schoenebeck 705 String SetChannelMute(bool bMute, uint uiSamplerChannel);
129     String SetChannelSolo(bool bSolo, uint uiSamplerChannel);
130 schoenebeck 53 String ResetChannel(uint uiSamplerChannel);
131 schoenebeck 212 String ResetSampler();
132 schoenebeck 563 String GetServerInfo();
133 senkov 170 String SubscribeNotification(LSCPEvent::event_t);
134     String UnsubscribeNotification(LSCPEvent::event_t);
135 senkov 397 String QueryDatabase(String query);
136 schoenebeck 210 String SetEcho(yyparse_param_t* pSession, double boolean_value);
137 schoenebeck 35 void AnswerClient(String ReturnMessage);
138 senkov 170
139     static int currentSocket;
140     static std::map<int,String> bufferedCommands;
141 senkov 184
142     static void SendLSCPNotify( LSCPEvent Event );
143 senkov 360 static int EventSubscribers( std::list<LSCPEvent::event_t> events );
144     static void LockRTNotify( void ) { RTNotifyMutex.Lock(); }
145     static void UnlockRTNotify( void ) { RTNotifyMutex.Unlock(); }
146 senkov 184
147 schoenebeck 35 protected:
148 schoenebeck 53 int hSocket;
149     sockaddr_in SocketAddress;
150     Sampler* pSampler;
151 schoenebeck 211 Condition Initialized;
152 schoenebeck 385 LSCPInstrumentLoader InstrumentLoader; ///< thread responsible for loading instruments in the background
153 schoenebeck 35
154     int Main(); ///< Implementation of virtual method from class Thread
155 senkov 170
156 schoenebeck 35 private:
157 schoenebeck 209
158 schoenebeck 35 /**
159 capela 143 * Find a created audio output device index.
160     */
161     int GetAudioOutputDeviceIndex (AudioOutputDevice *pDevice);
162 schoenebeck 209
163 senkov 155 /**
164     * Find a created midi input device index.
165     */
166     int GetMidiInputDeviceIndex (MidiInputDevice *pDevice);
167 capela 143
168 schoenebeck 705 bool HasSoloChannel();
169     void MuteNonSoloChannels();
170     void UnmuteChannels();
171    
172 senkov 170 static std::map<int,String> bufferedNotifies;
173     static Mutex NotifyMutex;
174     static Mutex NotifyBufferMutex;
175 schoenebeck 210 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 senkov 170 static Mutex SubscriptionMutex;
179     static std::map< LSCPEvent::event_t, std::list<int> > eventSubscriptions;
180     static fd_set fdSet;
181 senkov 360
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 schoenebeck 35 };
187    
188     #endif // __LSCPSERVER_H_

  ViewVC Help
Powered by ViewVC