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 - 2010 Christian Schoenebeck * |
* Copyright (C) 2005 - 2012 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 * |
138 |
LSCPEvent::RegisterEvent(LSCPEvent::event_global_info, "GLOBAL_INFO"); |
LSCPEvent::RegisterEvent(LSCPEvent::event_global_info, "GLOBAL_INFO"); |
139 |
LSCPEvent::RegisterEvent(LSCPEvent::event_channel_midi, "CHANNEL_MIDI"); |
LSCPEvent::RegisterEvent(LSCPEvent::event_channel_midi, "CHANNEL_MIDI"); |
140 |
LSCPEvent::RegisterEvent(LSCPEvent::event_device_midi, "DEVICE_MIDI"); |
LSCPEvent::RegisterEvent(LSCPEvent::event_device_midi, "DEVICE_MIDI"); |
141 |
|
LSCPEvent::RegisterEvent(LSCPEvent::event_fx_instance_count, "EFFECT_INSTANCE_COUNT"); |
142 |
|
LSCPEvent::RegisterEvent(LSCPEvent::event_fx_instance_info, "EFFECT_INSTANCE_INFO"); |
143 |
|
LSCPEvent::RegisterEvent(LSCPEvent::event_send_fx_chain_count, "SEND_EFFECT_CHAIN_COUNT"); |
144 |
|
LSCPEvent::RegisterEvent(LSCPEvent::event_send_fx_chain_info, "SEND_EFFECT_CHAIN_INFO"); |
145 |
hSocket = -1; |
hSocket = -1; |
146 |
} |
} |
147 |
|
|
447 |
#endif |
#endif |
448 |
// check if some engine channel's parameter / status changed, if so notify the respective LSCP event subscribers |
// check if some engine channel's parameter / status changed, if so notify the respective LSCP event subscribers |
449 |
{ |
{ |
450 |
|
EngineChannelFactory::EngineChannelsMutex.Lock(); |
451 |
std::set<EngineChannel*> engineChannels = EngineChannelFactory::EngineChannelInstances(); |
std::set<EngineChannel*> engineChannels = EngineChannelFactory::EngineChannelInstances(); |
452 |
std::set<EngineChannel*>::iterator itEngineChannel = engineChannels.begin(); |
std::set<EngineChannel*>::iterator itEngineChannel = engineChannels.begin(); |
453 |
std::set<EngineChannel*>::iterator itEnd = engineChannels.end(); |
std::set<EngineChannel*>::iterator itEnd = engineChannels.end(); |
465 |
} |
} |
466 |
} |
} |
467 |
} |
} |
468 |
|
EngineChannelFactory::EngineChannelsMutex.Unlock(); |
469 |
} |
} |
470 |
|
|
471 |
// check if MIDI data arrived on some engine channel |
// check if MIDI data arrived on some engine channel |
2399 |
result.Add("MIDI_CONTROLLER", pFxSend->MidiController()); |
result.Add("MIDI_CONTROLLER", pFxSend->MidiController()); |
2400 |
result.Add("LEVEL", ToString(pFxSend->Level())); |
result.Add("LEVEL", ToString(pFxSend->Level())); |
2401 |
result.Add("AUDIO_OUTPUT_ROUTING", AudioRouting); |
result.Add("AUDIO_OUTPUT_ROUTING", AudioRouting); |
2402 |
result.Add("SEND_EFFECT", sEffectRouting); |
result.Add("EFFECT", sEffectRouting); |
2403 |
} catch (Exception e) { |
} catch (Exception e) { |
2404 |
result.Error(e); |
result.Error(e); |
2405 |
} |
} |
2616 |
); |
); |
2617 |
|
|
2618 |
pEffectControl->SetValue(dValue); |
pEffectControl->SetValue(dValue); |
2619 |
|
LSCPServer::SendLSCPNotify(LSCPEvent(LSCPEvent::event_fx_instance_info, iEffectInstance)); |
2620 |
} catch (Exception e) { |
} catch (Exception e) { |
2621 |
result.Error(e); |
result.Error(e); |
2622 |
} |
} |
2631 |
if (!pEffectInfo) |
if (!pEffectInfo) |
2632 |
throw Exception("There is no effect with index " + ToString(iEffectIndex)); |
throw Exception("There is no effect with index " + ToString(iEffectIndex)); |
2633 |
Effect* pEffect = EffectFactory::Create(pEffectInfo); |
Effect* pEffect = EffectFactory::Create(pEffectInfo); |
2634 |
result.Add(pEffect->ID()); |
result = pEffect->ID(); // success |
2635 |
|
LSCPServer::SendLSCPNotify(LSCPEvent(LSCPEvent::event_fx_instance_count, EffectFactory::EffectInstancesCount())); |
2636 |
} catch (Exception e) { |
} catch (Exception e) { |
2637 |
result.Error(e); |
result.Error(e); |
2638 |
} |
} |
2679 |
|
|
2680 |
Effect* pEffect = EffectFactory::Create(pEffectInfo); |
Effect* pEffect = EffectFactory::Create(pEffectInfo); |
2681 |
result = LSCPResultSet(pEffect->ID()); |
result = LSCPResultSet(pEffect->ID()); |
2682 |
|
LSCPServer::SendLSCPNotify(LSCPEvent(LSCPEvent::event_fx_instance_count, EffectFactory::EffectInstancesCount())); |
2683 |
} catch (Exception e) { |
} catch (Exception e) { |
2684 |
result.Error(e); |
result.Error(e); |
2685 |
} |
} |
2694 |
if (!pEffect) |
if (!pEffect) |
2695 |
throw Exception("There is no effect instance with ID " + ToString(iEffectInstance)); |
throw Exception("There is no effect instance with ID " + ToString(iEffectInstance)); |
2696 |
EffectFactory::Destroy(pEffect); |
EffectFactory::Destroy(pEffect); |
2697 |
|
LSCPServer::SendLSCPNotify(LSCPEvent(LSCPEvent::event_fx_instance_count, EffectFactory::EffectInstancesCount())); |
2698 |
} catch (Exception e) { |
} catch (Exception e) { |
2699 |
result.Error(e); |
result.Error(e); |
2700 |
} |
} |
2778 |
throw Exception("There is no audio output device with index " + ToString(iAudioOutputDevice) + "."); |
throw Exception("There is no audio output device with index " + ToString(iAudioOutputDevice) + "."); |
2779 |
AudioOutputDevice* pDevice = devices[iAudioOutputDevice]; |
AudioOutputDevice* pDevice = devices[iAudioOutputDevice]; |
2780 |
EffectChain* pEffectChain = pDevice->AddSendEffectChain(); |
EffectChain* pEffectChain = pDevice->AddSendEffectChain(); |
2781 |
result.Add(pEffectChain->ID()); |
result = pEffectChain->ID(); |
2782 |
|
LSCPServer::SendLSCPNotify(LSCPEvent(LSCPEvent::event_send_fx_chain_count, iAudioOutputDevice, pDevice->SendEffectChainCount())); |
2783 |
} catch (Exception e) { |
} catch (Exception e) { |
2784 |
result.Error(e); |
result.Error(e); |
2785 |
} |
} |
2793 |
std::map<uint,AudioOutputDevice*> devices = pSampler->GetAudioOutputDevices(); |
std::map<uint,AudioOutputDevice*> devices = pSampler->GetAudioOutputDevices(); |
2794 |
if (!devices.count(iAudioOutputDevice)) |
if (!devices.count(iAudioOutputDevice)) |
2795 |
throw Exception("There is no audio output device with index " + ToString(iAudioOutputDevice) + "."); |
throw Exception("There is no audio output device with index " + ToString(iAudioOutputDevice) + "."); |
2796 |
|
|
2797 |
|
std::set<EngineChannel*> engineChannels = EngineChannelFactory::EngineChannelInstances(); |
2798 |
|
std::set<EngineChannel*>::iterator itEngineChannel = engineChannels.begin(); |
2799 |
|
std::set<EngineChannel*>::iterator itEnd = engineChannels.end(); |
2800 |
|
for (; itEngineChannel != itEnd; ++itEngineChannel) { |
2801 |
|
AudioOutputDevice* pDev = (*itEngineChannel)->GetAudioOutputDevice(); |
2802 |
|
if (pDev != NULL && pDev->deviceId() == iAudioOutputDevice) { |
2803 |
|
for (int i = 0; i < (*itEngineChannel)->GetFxSendCount(); i++) { |
2804 |
|
FxSend* fxs = (*itEngineChannel)->GetFxSend(i); |
2805 |
|
if(fxs != NULL && fxs->DestinationEffectChain() == iSendEffectChain) { |
2806 |
|
throw Exception("The effect chain is still in use by channel " + ToString((*itEngineChannel)->GetSamplerChannel()->Index())); |
2807 |
|
} |
2808 |
|
} |
2809 |
|
} |
2810 |
|
} |
2811 |
|
|
2812 |
AudioOutputDevice* pDevice = devices[iAudioOutputDevice]; |
AudioOutputDevice* pDevice = devices[iAudioOutputDevice]; |
2813 |
for (int i = 0; i < pDevice->SendEffectChainCount(); i++) { |
for (int i = 0; i < pDevice->SendEffectChainCount(); i++) { |
2814 |
EffectChain* pEffectChain = pDevice->SendEffectChain(i); |
EffectChain* pEffectChain = pDevice->SendEffectChain(i); |
2815 |
if (pEffectChain->ID() == iSendEffectChain) { |
if (pEffectChain->ID() == iSendEffectChain) { |
2816 |
pDevice->RemoveSendEffectChain(i); |
pDevice->RemoveSendEffectChain(i); |
2817 |
|
LSCPServer::SendLSCPNotify(LSCPEvent(LSCPEvent::event_send_fx_chain_count, iAudioOutputDevice, pDevice->SendEffectChainCount())); |
2818 |
return result.Produce(); |
return result.Produce(); |
2819 |
} |
} |
2820 |
} |
} |
2837 |
ToString(iAudioOutputDevice) + "." |
ToString(iAudioOutputDevice) + "." |
2838 |
); |
); |
2839 |
AudioOutputDevice* pDevice = devices[iAudioOutputDevice]; |
AudioOutputDevice* pDevice = devices[iAudioOutputDevice]; |
2840 |
for (int i = 0; i < pDevice->SendEffectChainCount(); i++) { |
EffectChain* pEffectChain = pDevice->SendEffectChainByID(iSendEffectChain); |
2841 |
EffectChain* pEffectChain = pDevice->SendEffectChain(i); |
if(pEffectChain != NULL) return pEffectChain; |
|
if (pEffectChain->ID() == iSendEffectChain) { |
|
|
return pEffectChain; |
|
|
} |
|
|
} |
|
2842 |
throw Exception( |
throw Exception( |
2843 |
"There is no send effect chain with ID " + |
"There is no send effect chain with ID " + |
2844 |
ToString(iSendEffectChain) + " for audio output device " + |
ToString(iSendEffectChain) + " for audio output device " + |
2875 |
if (!pEffect) |
if (!pEffect) |
2876 |
throw Exception("There is no effect instance with ID " + ToString(iEffectInstance)); |
throw Exception("There is no effect instance with ID " + ToString(iEffectInstance)); |
2877 |
pEffectChain->AppendEffect(pEffect); |
pEffectChain->AppendEffect(pEffect); |
2878 |
|
LSCPServer::SendLSCPNotify(LSCPEvent(LSCPEvent::event_send_fx_chain_info, iAudioOutputDevice, iSendEffectChain, pEffectChain->EffectCount())); |
2879 |
} catch (Exception e) { |
} catch (Exception e) { |
2880 |
result.Error(e); |
result.Error(e); |
2881 |
} |
} |
2892 |
if (!pEffect) |
if (!pEffect) |
2893 |
throw Exception("There is no effect instance with index " + ToString(iEffectInstance)); |
throw Exception("There is no effect instance with index " + ToString(iEffectInstance)); |
2894 |
pEffectChain->InsertEffect(pEffect, iEffectChainPosition); |
pEffectChain->InsertEffect(pEffect, iEffectChainPosition); |
2895 |
|
LSCPServer::SendLSCPNotify(LSCPEvent(LSCPEvent::event_send_fx_chain_info, iAudioOutputDevice, iSendEffectChain, pEffectChain->EffectCount())); |
2896 |
} catch (Exception e) { |
} catch (Exception e) { |
2897 |
result.Error(e); |
result.Error(e); |
2898 |
} |
} |
2905 |
try { |
try { |
2906 |
EffectChain* pEffectChain = |
EffectChain* pEffectChain = |
2907 |
_getSendEffectChain(pSampler, iAudioOutputDevice, iSendEffectChain); |
_getSendEffectChain(pSampler, iAudioOutputDevice, iSendEffectChain); |
2908 |
|
|
2909 |
|
std::set<EngineChannel*> engineChannels = EngineChannelFactory::EngineChannelInstances(); |
2910 |
|
std::set<EngineChannel*>::iterator itEngineChannel = engineChannels.begin(); |
2911 |
|
std::set<EngineChannel*>::iterator itEnd = engineChannels.end(); |
2912 |
|
for (; itEngineChannel != itEnd; ++itEngineChannel) { |
2913 |
|
AudioOutputDevice* pDev = (*itEngineChannel)->GetAudioOutputDevice(); |
2914 |
|
if (pDev != NULL && pDev->deviceId() == iAudioOutputDevice) { |
2915 |
|
for (int i = 0; i < (*itEngineChannel)->GetFxSendCount(); i++) { |
2916 |
|
FxSend* fxs = (*itEngineChannel)->GetFxSend(i); |
2917 |
|
if(fxs != NULL && fxs->DestinationEffectChain() == iSendEffectChain && fxs->DestinationEffectChainPosition() == iEffectChainPosition) { |
2918 |
|
throw Exception("The effect instance is still in use by channel " + ToString((*itEngineChannel)->GetSamplerChannel()->Index())); |
2919 |
|
} |
2920 |
|
} |
2921 |
|
} |
2922 |
|
} |
2923 |
|
|
2924 |
pEffectChain->RemoveEffect(iEffectChainPosition); |
pEffectChain->RemoveEffect(iEffectChainPosition); |
2925 |
|
LSCPServer::SendLSCPNotify(LSCPEvent(LSCPEvent::event_send_fx_chain_info, iAudioOutputDevice, iSendEffectChain, pEffectChain->EffectCount())); |
2926 |
} catch (Exception e) { |
} catch (Exception e) { |
2927 |
result.Error(e); |
result.Error(e); |
2928 |
} |
} |