90 |
send(hSession, ReturnMessage.c_str(), ReturnMessage.size(), 0); |
send(hSession, ReturnMessage.c_str(), ReturnMessage.size(), 0); |
91 |
} |
} |
92 |
|
|
93 |
|
/** |
94 |
|
* Find a created audio output device index. |
95 |
|
*/ |
96 |
|
int LSCPServer::GetAudioOutputDeviceIndex ( AudioOutputDevice *pDevice ) |
97 |
|
{ |
98 |
|
// Search for the created device to get its index |
99 |
|
std::map<uint, AudioOutputDevice*> devices = pSampler->GetAudioOutputDevices(); |
100 |
|
std::map<uint, AudioOutputDevice*>::iterator iter = devices.begin(); |
101 |
|
for (; iter != devices.end(); iter++) { |
102 |
|
if (iter->second == pDevice) |
103 |
|
return iter->first; |
104 |
|
} |
105 |
|
// Not found. |
106 |
|
return -1; |
107 |
|
} |
108 |
|
|
109 |
String LSCPServer::CreateAudioOutputDevice(String Driver, std::map<String,String> Parameters) { |
String LSCPServer::CreateAudioOutputDevice(String Driver, std::map<String,String> Parameters) { |
110 |
dmsg(2,("LSCPServer: CreateAudioOutputDevice(Driver=%s)\n", Driver.c_str())); |
dmsg(2,("LSCPServer: CreateAudioOutputDevice(Driver=%s)\n", Driver.c_str())); |
111 |
LSCPResultSet result; |
LSCPResultSet result; |
112 |
try { |
try { |
113 |
AudioOutputDevice* pDevice = pSampler->CreateAudioOutputDevice(Driver, Parameters); |
AudioOutputDevice* pDevice = pSampler->CreateAudioOutputDevice(Driver, Parameters); |
|
std::map<uint, AudioOutputDevice*> devices = pSampler->GetAudioOutputDevices(); |
|
114 |
// search for the created device to get its index |
// search for the created device to get its index |
115 |
int index = -1; |
int index = GetAudioOutputDeviceIndex(pDevice); |
|
std::map<uint, AudioOutputDevice*>::iterator iter = devices.begin(); |
|
|
for (; iter != devices.end(); iter++) { |
|
|
if (iter->second == pDevice) { |
|
|
index = iter->first; |
|
|
break; |
|
|
} |
|
|
} |
|
116 |
if (index == -1) throw LinuxSamplerException("Internal error: could not find created audio output device."); |
if (index == -1) throw LinuxSamplerException("Internal error: could not find created audio output device."); |
117 |
result = index; // success |
result = index; // success |
118 |
} |
} |
148 |
if (!pSamplerChannel) throw LinuxSamplerException("Index out of bounds"); |
if (!pSamplerChannel) throw LinuxSamplerException("Index out of bounds"); |
149 |
Engine* pEngine = pSamplerChannel->GetEngine(); |
Engine* pEngine = pSamplerChannel->GetEngine(); |
150 |
if (!pEngine) throw LinuxSamplerException("No engine loaded on channel"); |
if (!pEngine) throw LinuxSamplerException("No engine loaded on channel"); |
151 |
|
if (pSamplerChannel->GetAudioOutputDevice() == NULL) |
152 |
|
throw LinuxSamplerException("No audio output device on channel"); |
153 |
if (bBackground) { |
if (bBackground) { |
154 |
LSCPLoadInstrument *pLoadInstrument = new LSCPLoadInstrument(pEngine, Filename.c_str(), uiInstrument); |
LSCPLoadInstrument *pLoadInstrument = new LSCPLoadInstrument(pEngine, Filename.c_str(), uiInstrument); |
155 |
pLoadInstrument->StartThread(); |
pLoadInstrument->StartThread(); |
273 |
result.Add("ENGINE_NAME", EngineName); |
result.Add("ENGINE_NAME", EngineName); |
274 |
result.Add("VOLUME", Volume); |
result.Add("VOLUME", Volume); |
275 |
|
|
276 |
//Some hardcoded stuff for now to make GUI look good |
//Some not-so-hardcoded stuff to make GUI look good |
277 |
result.Add("AUDIO_OUTPUT_DEVICE", "0"); |
result.Add("AUDIO_OUTPUT_DEVICE", GetAudioOutputDeviceIndex(pSamplerChannel->GetAudioOutputDevice())); |
278 |
result.Add("AUDIO_OUTPUT_CHANNELS", "2"); |
result.Add("AUDIO_OUTPUT_CHANNELS", "2"); |
279 |
result.Add("AUDIO_OUTPUT_ROUTING", "0,1"); |
result.Add("AUDIO_OUTPUT_ROUTING", "0,1"); |
280 |
|
|
464 |
std::map<uint,AudioOutputDevice*> devices = pSampler->GetAudioOutputDevices(); |
std::map<uint,AudioOutputDevice*> devices = pSampler->GetAudioOutputDevices(); |
465 |
if (!devices[DeviceIndex]) throw LinuxSamplerException("There is no audio output device with index " + ToString(DeviceIndex) + "."); |
if (!devices[DeviceIndex]) throw LinuxSamplerException("There is no audio output device with index " + ToString(DeviceIndex) + "."); |
466 |
AudioOutputDevice* pDevice = devices[DeviceIndex]; |
AudioOutputDevice* pDevice = devices[DeviceIndex]; |
467 |
|
result.Add("driver", pDevice->Driver()); |
468 |
std::map<String,DeviceCreationParameter*> parameters = pDevice->DeviceParameters(); |
std::map<String,DeviceCreationParameter*> parameters = pDevice->DeviceParameters(); |
469 |
std::map<String,DeviceCreationParameter*>::iterator iter = parameters.begin(); |
std::map<String,DeviceCreationParameter*>::iterator iter = parameters.begin(); |
470 |
for (; iter != parameters.end(); iter++) { |
for (; iter != parameters.end(); iter++) { |
589 |
return "ERR:0:Not implemented yet.\r\n"; //FIXME: Add support for this in resultset class? |
return "ERR:0:Not implemented yet.\r\n"; //FIXME: Add support for this in resultset class? |
590 |
} |
} |
591 |
|
|
592 |
|
String LSCPServer::SetAudioOutputType(String AudioOutputDriver, uint uiSamplerChannel) { |
593 |
|
dmsg(2,("LSCPServer: SetAudioOutputType(String AudioOutputDriver=%s, SamplerChannel=%d)\n",AudioOutputDriver.c_str(),uiSamplerChannel)); |
594 |
|
LSCPResultSet result; |
595 |
|
try { |
596 |
|
SamplerChannel* pSamplerChannel = pSampler->GetSamplerChannel(uiSamplerChannel); |
597 |
|
if (!pSamplerChannel) throw LinuxSamplerException("Invalid channel number " + ToString(uiSamplerChannel)); |
598 |
|
// Driver type name aliasing... |
599 |
|
if (AudioOutputDriver == "ALSA") AudioOutputDriver = "Alsa"; |
600 |
|
if (AudioOutputDriver == "JACK") AudioOutputDriver = "Jack"; |
601 |
|
// Check if there's one audio output device already created |
602 |
|
// for the intended audio driver type (AudioOutputDriver)... |
603 |
|
AudioOutputDevice *pDevice = NULL; |
604 |
|
std::map<uint, AudioOutputDevice*> devices = pSampler->GetAudioOutputDevices(); |
605 |
|
std::map<uint, AudioOutputDevice*>::iterator iter = devices.begin(); |
606 |
|
for (; iter != devices.end(); iter++) { |
607 |
|
if ((iter->second)->Driver() == AudioOutputDriver) { |
608 |
|
pDevice = iter->second; |
609 |
|
break; |
610 |
|
} |
611 |
|
} |
612 |
|
// If it doesn't exist, create a new one with default parameters... |
613 |
|
if (pDevice == NULL) { |
614 |
|
std::map<String,String> params; |
615 |
|
pDevice = pSampler->CreateAudioOutputDevice(AudioOutputDriver, params); |
616 |
|
} |
617 |
|
// Must have a device... |
618 |
|
if (pDevice == NULL) |
619 |
|
throw LinuxSamplerException("Internal error: could not create audio output device."); |
620 |
|
// Set it as the current channel device... |
621 |
|
pSamplerChannel->SetAudioOutputDevice(pDevice); |
622 |
|
} |
623 |
|
catch (LinuxSamplerException e) { |
624 |
|
result.Error(e); |
625 |
|
} |
626 |
|
return result.Produce(); |
627 |
|
} |
628 |
|
|
629 |
|
|
630 |
String LSCPServer::SetMIDIInputType(String MidiInputDriver, uint uiSamplerChannel) { |
String LSCPServer::SetMIDIInputType(String MidiInputDriver, uint uiSamplerChannel) { |
631 |
dmsg(2,("LSCPServer: SetMIDIInputType(String MidiInputDriver=%s, SamplerChannel=%d)\n",MidiInputDriver.c_str(),uiSamplerChannel)); |
dmsg(2,("LSCPServer: SetMIDIInputType(String MidiInputDriver=%s, SamplerChannel=%d)\n",MidiInputDriver.c_str(),uiSamplerChannel)); |
632 |
LSCPResultSet result; |
LSCPResultSet result; |
634 |
SamplerChannel* pSamplerChannel = pSampler->GetSamplerChannel(uiSamplerChannel); |
SamplerChannel* pSamplerChannel = pSampler->GetSamplerChannel(uiSamplerChannel); |
635 |
if (!pSamplerChannel) throw LinuxSamplerException("Index out of bounds"); |
if (!pSamplerChannel) throw LinuxSamplerException("Index out of bounds"); |
636 |
// FIXME: workaround until MIDI driver configuration is implemented (using a Factory class for the MIDI input drivers then, like its already done for audio output drivers) |
// FIXME: workaround until MIDI driver configuration is implemented (using a Factory class for the MIDI input drivers then, like its already done for audio output drivers) |
637 |
|
if (MidiInputDriver == "ALSA") MidiInputDriver = "Alsa"; |
638 |
if (MidiInputDriver != "Alsa") throw LinuxSamplerException("Unknown MIDI input driver '" + MidiInputDriver + "'."); |
if (MidiInputDriver != "Alsa") throw LinuxSamplerException("Unknown MIDI input driver '" + MidiInputDriver + "'."); |
639 |
MidiInputDevice::type_t MidiInputType = MidiInputDevice::type_alsa; |
MidiInputDevice::type_t MidiInputType = MidiInputDevice::type_alsa; |
640 |
pSamplerChannel->SetMidiInputDevice(MidiInputType); |
pSamplerChannel->SetMidiInputDevice(MidiInputType); |
689 |
try { |
try { |
690 |
SamplerChannel* pSamplerChannel = pSampler->GetSamplerChannel(uiSamplerChannel); |
SamplerChannel* pSamplerChannel = pSampler->GetSamplerChannel(uiSamplerChannel); |
691 |
if (!pSamplerChannel) throw LinuxSamplerException("Invalid channel number " + ToString(uiSamplerChannel)); |
if (!pSamplerChannel) throw LinuxSamplerException("Invalid channel number " + ToString(uiSamplerChannel)); |
|
Engine* pEngine = pSamplerChannel->GetEngine(); |
|
|
if (!pEngine) throw LinuxSamplerException("No engine loaded on channel"); |
|
692 |
std::map<uint, AudioOutputDevice*> devices = pSampler->GetAudioOutputDevices(); |
std::map<uint, AudioOutputDevice*> devices = pSampler->GetAudioOutputDevices(); |
693 |
if (!devices[AudioDeviceId]) throw LinuxSamplerException("There is no audio output device with index " + ToString(AudioDeviceId)); |
if (!devices[AudioDeviceId]) throw LinuxSamplerException("There is no audio output device with index " + ToString(AudioDeviceId)); |
694 |
AudioOutputDevice* pDevice = devices[AudioDeviceId]; |
AudioOutputDevice* pDevice = devices[AudioDeviceId]; |