3 |
* LinuxSampler - modular, streaming capable sampler * |
* LinuxSampler - modular, streaming capable sampler * |
4 |
* * |
* * |
5 |
* Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck * |
* Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck * |
6 |
* Copyright (C) 2005 - 2007 Christian Schoenebeck * |
* Copyright (C) 2005 - 2008 Christian Schoenebeck * |
7 |
* * |
* * |
8 |
* This library is free software; you can redistribute it and/or modify * |
* 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 * |
* it under the terms of the GNU General Public License as published by * |
101 |
Mutex LSCPServer::SubscriptionMutex = Mutex(); |
Mutex LSCPServer::SubscriptionMutex = Mutex(); |
102 |
Mutex LSCPServer::RTNotifyMutex = Mutex(); |
Mutex LSCPServer::RTNotifyMutex = Mutex(); |
103 |
|
|
104 |
LSCPServer::LSCPServer(Sampler* pSampler, long int addr, short int port) : Thread(true, false, 0, -4) { |
LSCPServer::LSCPServer(Sampler* pSampler, long int addr, short int port) : Thread(true, false, 0, -4), eventHandler(this) { |
105 |
SocketAddress.sin_family = AF_INET; |
SocketAddress.sin_family = AF_INET; |
106 |
SocketAddress.sin_addr.s_addr = addr; |
SocketAddress.sin_addr.s_addr = addr; |
107 |
SocketAddress.sin_port = port; |
SocketAddress.sin_port = port; |
130 |
LSCPEvent::RegisterEvent(LSCPEvent::event_total_stream_count, "TOTAL_STREAM_COUNT"); |
LSCPEvent::RegisterEvent(LSCPEvent::event_total_stream_count, "TOTAL_STREAM_COUNT"); |
131 |
LSCPEvent::RegisterEvent(LSCPEvent::event_total_voice_count, "TOTAL_VOICE_COUNT"); |
LSCPEvent::RegisterEvent(LSCPEvent::event_total_voice_count, "TOTAL_VOICE_COUNT"); |
132 |
LSCPEvent::RegisterEvent(LSCPEvent::event_global_info, "GLOBAL_INFO"); |
LSCPEvent::RegisterEvent(LSCPEvent::event_global_info, "GLOBAL_INFO"); |
133 |
|
LSCPEvent::RegisterEvent(LSCPEvent::event_channel_midi, "CHANNEL_MIDI"); |
134 |
hSocket = -1; |
hSocket = -1; |
135 |
} |
} |
136 |
|
|
142 |
#endif |
#endif |
143 |
} |
} |
144 |
|
|
145 |
|
LSCPServer::EventHandler::EventHandler(LSCPServer* pParent) { |
146 |
|
this->pParent = pParent; |
147 |
|
} |
148 |
|
|
149 |
|
LSCPServer::EventHandler::~EventHandler() { |
150 |
|
std::vector<midi_listener_entry> l = channelMidiListeners; |
151 |
|
channelMidiListeners.clear(); |
152 |
|
for (int i = 0; i < l.size(); i++) |
153 |
|
delete l[i].pMidiListener; |
154 |
|
} |
155 |
|
|
156 |
void LSCPServer::EventHandler::ChannelCountChanged(int NewCount) { |
void LSCPServer::EventHandler::ChannelCountChanged(int NewCount) { |
157 |
LSCPServer::SendLSCPNotify(LSCPEvent(LSCPEvent::event_channel_count, NewCount)); |
LSCPServer::SendLSCPNotify(LSCPEvent(LSCPEvent::event_channel_count, NewCount)); |
158 |
} |
} |
159 |
|
|
160 |
|
void LSCPServer::EventHandler::ChannelAdded(SamplerChannel* pChannel) { |
161 |
|
pChannel->AddEngineChangeListener(this); |
162 |
|
} |
163 |
|
|
164 |
|
void LSCPServer::EventHandler::ChannelToBeRemoved(SamplerChannel* pChannel) { |
165 |
|
if (!pChannel->GetEngineChannel()) return; |
166 |
|
EngineToBeChanged(pChannel->Index()); |
167 |
|
} |
168 |
|
|
169 |
|
void LSCPServer::EventHandler::EngineToBeChanged(int ChannelId) { |
170 |
|
SamplerChannel* pSamplerChannel = |
171 |
|
pParent->pSampler->GetSamplerChannel(ChannelId); |
172 |
|
if (!pSamplerChannel) return; |
173 |
|
EngineChannel* pEngineChannel = |
174 |
|
pSamplerChannel->GetEngineChannel(); |
175 |
|
if (!pEngineChannel) return; |
176 |
|
for (std::vector<midi_listener_entry>::iterator iter = channelMidiListeners.begin(); iter != channelMidiListeners.end(); ++iter) { |
177 |
|
if ((*iter).pEngineChannel == pEngineChannel) { |
178 |
|
VirtualMidiDevice* pMidiListener = (*iter).pMidiListener; |
179 |
|
pEngineChannel->Disconnect(pMidiListener); |
180 |
|
channelMidiListeners.erase(iter); |
181 |
|
delete pMidiListener; |
182 |
|
return; |
183 |
|
} |
184 |
|
} |
185 |
|
} |
186 |
|
|
187 |
|
void LSCPServer::EventHandler::EngineChanged(int ChannelId) { |
188 |
|
SamplerChannel* pSamplerChannel = |
189 |
|
pParent->pSampler->GetSamplerChannel(ChannelId); |
190 |
|
if (!pSamplerChannel) return; |
191 |
|
EngineChannel* pEngineChannel = |
192 |
|
pSamplerChannel->GetEngineChannel(); |
193 |
|
if (!pEngineChannel) return; |
194 |
|
VirtualMidiDevice* pMidiListener = new VirtualMidiDevice; |
195 |
|
pEngineChannel->Connect(pMidiListener); |
196 |
|
midi_listener_entry entry = { |
197 |
|
pSamplerChannel, pEngineChannel, pMidiListener |
198 |
|
}; |
199 |
|
channelMidiListeners.push_back(entry); |
200 |
|
} |
201 |
|
|
202 |
void LSCPServer::EventHandler::AudioDeviceCountChanged(int NewCount) { |
void LSCPServer::EventHandler::AudioDeviceCountChanged(int NewCount) { |
203 |
LSCPServer::SendLSCPNotify(LSCPEvent(LSCPEvent::event_audio_device_count, NewCount)); |
LSCPServer::SendLSCPNotify(LSCPEvent(LSCPEvent::event_audio_device_count, NewCount)); |
204 |
} |
} |
385 |
} |
} |
386 |
} |
} |
387 |
} |
} |
388 |
|
} |
389 |
|
|
390 |
|
// check if MIDI data arrived on some engine channel |
391 |
|
for (int i = 0; i < eventHandler.channelMidiListeners.size(); ++i) { |
392 |
|
const EventHandler::midi_listener_entry entry = |
393 |
|
eventHandler.channelMidiListeners[i]; |
394 |
|
VirtualMidiDevice* pMidiListener = entry.pMidiListener; |
395 |
|
if (pMidiListener->NotesChanged()) { |
396 |
|
for (int iNote = 0; iNote < 128; iNote++) { |
397 |
|
if (pMidiListener->NoteChanged(iNote)) { |
398 |
|
const bool bActive = pMidiListener->NoteIsActive(iNote); |
399 |
|
LSCPServer::SendLSCPNotify( |
400 |
|
LSCPEvent( |
401 |
|
LSCPEvent::event_channel_midi, |
402 |
|
entry.pSamplerChannel->Index(), |
403 |
|
std::string(bActive ? "NOTE_ON" : "NOTE_OFF"), |
404 |
|
iNote, |
405 |
|
bActive ? pMidiListener->NoteOnVelocity(iNote) |
406 |
|
: pMidiListener->NoteOffVelocity(iNote) |
407 |
|
) |
408 |
|
); |
409 |
|
} |
410 |
|
} |
411 |
|
} |
412 |
} |
} |
413 |
|
|
414 |
//Now let's deliver late notifies (if any) |
//Now let's deliver late notifies (if any) |