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

Diff of /linuxsampler/trunk/src/network/lscpserver.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 705 by schoenebeck, Wed Jul 20 21:43:23 2005 UTC revision 793 by iliev, Wed Oct 26 09:34:38 2005 UTC
# Line 72  LSCPServer::LSCPServer(Sampler* pSampler Line 72  LSCPServer::LSCPServer(Sampler* pSampler
72      LSCPEvent::RegisterEvent(LSCPEvent::event_buffer_fill, "BUFFER_FILL");      LSCPEvent::RegisterEvent(LSCPEvent::event_buffer_fill, "BUFFER_FILL");
73      LSCPEvent::RegisterEvent(LSCPEvent::event_channel_info, "CHANNEL_INFO");      LSCPEvent::RegisterEvent(LSCPEvent::event_channel_info, "CHANNEL_INFO");
74      LSCPEvent::RegisterEvent(LSCPEvent::event_misc, "MISCELLANEOUS");      LSCPEvent::RegisterEvent(LSCPEvent::event_misc, "MISCELLANEOUS");
75        LSCPEvent::RegisterEvent(LSCPEvent::event_total_voice_count, "TOTAL_VOICE_COUNT");
76      hSocket = -1;      hSocket = -1;
77  }  }
78    
# Line 127  int LSCPServer::Main() { Line 128  int LSCPServer::Main() {
128      FD_SET(hSocket, &fdSet);      FD_SET(hSocket, &fdSet);
129      int maxSessions = hSocket;      int maxSessions = hSocket;
130    
131        timeval timeout;
132    
133      while (true) {      while (true) {
134          fd_set selectSet = fdSet;          // check if some engine channel's parameter / status changed, if so notify the respective LSCP event subscribers
135          int retval = select(maxSessions+1, &selectSet, NULL, NULL, NULL);          {
136                std::set<EngineChannel*> engineChannels = EngineChannelFactory::EngineChannelInstances();
137                std::set<EngineChannel*>::iterator itEngineChannel = engineChannels.begin();
138                std::set<EngineChannel*>::iterator itEnd           = engineChannels.end();
139                for (; itEngineChannel != itEnd; ++itEngineChannel) {
140                    if ((*itEngineChannel)->StatusChanged()) {
141                        SendLSCPNotify(LSCPEvent(LSCPEvent::event_channel_info, (*itEngineChannel)->iSamplerChannelIndex));
142                    }
143                }
144            }
145    
146            //Now let's deliver late notifies (if any)
147            NotifyBufferMutex.Lock();
148            for (std::map<int,String>::iterator iterNotify = bufferedNotifies.begin(); iterNotify != bufferedNotifies.end(); iterNotify++) {
149                    send(iterNotify->first, iterNotify->second.c_str(), iterNotify->second.size(), MSG_NOSIGNAL);
150                    bufferedNotifies.erase(iterNotify);
151            }
152            NotifyBufferMutex.Unlock();
153    
154            fd_set selectSet = fdSet;
155            timeout.tv_sec  = 0;
156            timeout.tv_usec = 100000;
157    
158            int retval = select(maxSessions+1, &selectSet, NULL, NULL, &timeout);
159    
160          if (retval == 0)          if (retval == 0)
161                  continue; //Nothing try again                  continue; //Nothing try again
162          if (retval == -1) {          if (retval == -1) {
# Line 189  int LSCPServer::Main() { Line 216  int LSCPServer::Main() {
216                          break;                          break;
217                  }                  }
218          }          }
   
         // check if some engine channel's parameter / status changed, if so notify the respective LSCP event subscribers  
         {  
             std::set<EngineChannel*> engineChannels = EngineChannelFactory::EngineChannelInstances();  
             std::set<EngineChannel*>::iterator itEngineChannel = engineChannels.begin();  
             std::set<EngineChannel*>::iterator itEnd           = engineChannels.end();  
             for (; itEngineChannel != itEnd; ++itEngineChannel) {  
                 if ((*itEngineChannel)->StatusChanged()) {  
                     SendLSCPNotify(LSCPEvent(LSCPEvent::event_channel_info, (*itEngineChannel)->iSamplerChannelIndex));  
                 }  
             }  
         }  
   
         //Now let's deliver late notifies (if any)  
         NotifyBufferMutex.Lock();  
         for (std::map<int,String>::iterator iterNotify = bufferedNotifies.begin(); iterNotify != bufferedNotifies.end(); iterNotify++) {  
                 send(iterNotify->first, iterNotify->second.c_str(), iterNotify->second.size(), 0);  
                 bufferedNotifies.erase(iterNotify);  
         }  
         NotifyBufferMutex.Unlock();  
219      }      }
220  }  }
221    
# Line 255  void LSCPServer::SendLSCPNotify( LSCPEve Line 262  void LSCPServer::SendLSCPNotify( LSCPEve
262          while (true) {          while (true) {
263                  if (NotifyMutex.Trylock()) {                  if (NotifyMutex.Trylock()) {
264                          for(;iter != end; iter++)                          for(;iter != end; iter++)
265                                  send(*iter, notify.c_str(), notify.size(), 0);                                  send(*iter, notify.c_str(), notify.size(), MSG_NOSIGNAL);
266                          NotifyMutex.Unlock();                          NotifyMutex.Unlock();
267                          break;                          break;
268                  } else {                  } else {
# Line 364  void LSCPServer::AnswerClient(String Ret Line 371  void LSCPServer::AnswerClient(String Ret
371      dmsg(2,("LSCPServer::AnswerClient(ReturnMessage=%s)", ReturnMessage.c_str()));      dmsg(2,("LSCPServer::AnswerClient(ReturnMessage=%s)", ReturnMessage.c_str()));
372      if (currentSocket != -1) {      if (currentSocket != -1) {
373              NotifyMutex.Lock();              NotifyMutex.Lock();
374              send(currentSocket, ReturnMessage.c_str(), ReturnMessage.size(), 0);              send(currentSocket, ReturnMessage.c_str(), ReturnMessage.size(), MSG_NOSIGNAL);
375              NotifyMutex.Unlock();              NotifyMutex.Unlock();
376      }      }
377  }  }
# Line 1545  String LSCPServer::GetServerInfo() { Line 1552  String LSCPServer::GetServerInfo() {
1552      return result.Produce();      return result.Produce();
1553  }  }
1554    
1555    /**
1556     * Will be called by the parser to return the current number of all active voices.
1557     */
1558    String LSCPServer::GetTotalVoiceCount() {
1559        dmsg(2,("LSCPServer: GetTotalVoiceCount()\n"));
1560        LSCPResultSet result;
1561        result.Add(pSampler->GetVoiceCount());
1562        return result.Produce();
1563    }
1564    
1565    /**
1566     * Will be called by the parser to return the maximum number of voices.
1567     */
1568    String LSCPServer::GetTotalVoiceCountMax() {
1569        dmsg(2,("LSCPServer: GetTotalVoiceCountMax()\n"));
1570        LSCPResultSet result;
1571        result.Add(EngineFactory::EngineInstances().size() * CONFIG_MAX_VOICES);
1572        return result.Produce();
1573    }
1574    
1575  /**  /**
1576   * Will be called by the parser to subscribe a client (frontend) on the   * Will be called by the parser to subscribe a client (frontend) on the
1577   * server for receiving event messages.   * server for receiving event messages.

Legend:
Removed from v.705  
changed lines
  Added in v.793

  ViewVC Help
Powered by ViewVC