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 |
|
|
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) { |
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 |
|
|
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 { |
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 |
} |
} |
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. |