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, 2006 Christian Schoenebeck * |
* Copyright (C) 2005 - 2008 Christian Schoenebeck * |
7 |
* * |
* * |
8 |
* This program is free software; you can redistribute it and/or modify * |
* This program 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 * |
86 |
} |
} |
87 |
|
|
88 |
void MidiInputDeviceAlsa::MidiInputPortAlsa::ParameterAlsaSeqBindings::OnSetValue(std::vector<String> vS) throw (Exception) { |
void MidiInputDeviceAlsa::MidiInputPortAlsa::ParameterAlsaSeqBindings::OnSetValue(std::vector<String> vS) throw (Exception) { |
89 |
|
std::vector<snd_seq_port_subscribe_t*>::iterator it = pPort->subscriptions.begin(); |
90 |
|
for (; it != pPort->subscriptions.end(); it++) { |
91 |
|
if(snd_seq_unsubscribe_port(pPort->pDevice->hAlsaSeq, *it)) { |
92 |
|
dmsg(1,("ParameterAlsaSeqBindings::OnSetValue: Can't unsubscribe port connection!.\n")); |
93 |
|
} |
94 |
|
snd_seq_port_subscribe_free(*it); |
95 |
|
} |
96 |
|
pPort->subscriptions.clear(); |
97 |
|
|
98 |
std::vector<String>::iterator iter = vS.begin(); |
std::vector<String>::iterator iter = vS.begin(); |
99 |
for (; iter != vS.end(); iter++) pPort->ConnectToAlsaMidiSource((*iter).c_str()); |
for (; iter != vS.end(); iter++) pPort->ConnectToAlsaMidiSource((*iter).c_str()); |
100 |
} |
} |
139 |
if (alsaPort < 0) throw MidiInputException("Error creating sequencer port"); |
if (alsaPort < 0) throw MidiInputException("Error creating sequencer port"); |
140 |
this->portNumber = alsaPort; |
this->portNumber = alsaPort; |
141 |
|
|
142 |
|
delete Parameters["NAME"]; |
143 |
Parameters["NAME"] = new ParameterName(this); |
Parameters["NAME"] = new ParameterName(this); |
144 |
Parameters["ALSA_SEQ_BINDINGS"] = new ParameterAlsaSeqBindings(this); |
Parameters["ALSA_SEQ_BINDINGS"] = new ParameterAlsaSeqBindings(this); |
145 |
Parameters["ALSA_SEQ_ID"] = new ParameterAlsaSeqId(this); |
Parameters["ALSA_SEQ_ID"] = new ParameterAlsaSeqId(this); |
166 |
sender.port = (char) hExtPort; |
sender.port = (char) hExtPort; |
167 |
dest.client = (char) pDevice->hAlsaSeqClient; |
dest.client = (char) pDevice->hAlsaSeqClient; |
168 |
dest.port = (char) portNumber; |
dest.port = (char) portNumber; |
169 |
snd_seq_port_subscribe_alloca(&subs); |
snd_seq_port_subscribe_malloc(&subs); |
170 |
snd_seq_port_subscribe_set_sender(subs, &sender); |
snd_seq_port_subscribe_set_sender(subs, &sender); |
171 |
snd_seq_port_subscribe_set_dest(subs, &dest); |
snd_seq_port_subscribe_set_dest(subs, &dest); |
172 |
snd_seq_port_subscribe_set_queue(subs, 1); |
snd_seq_port_subscribe_set_queue(subs, 1); |
173 |
snd_seq_port_subscribe_set_time_update(subs, 1); |
snd_seq_port_subscribe_set_time_update(subs, 1); |
174 |
snd_seq_port_subscribe_set_time_real(subs, 1); |
snd_seq_port_subscribe_set_time_real(subs, 1); |
175 |
if (snd_seq_subscribe_port(pDevice->hAlsaSeq, subs) < 0) |
if (snd_seq_subscribe_port(pDevice->hAlsaSeq, subs) < 0) { |
176 |
|
snd_seq_port_subscribe_free(subs); |
177 |
throw MidiInputException(String("Unable to connect to Alsa seq client \'") + MidiSource + "\' (" + snd_strerror(errno) + ")"); |
throw MidiInputException(String("Unable to connect to Alsa seq client \'") + MidiSource + "\' (" + snd_strerror(errno) + ")"); |
178 |
|
} |
179 |
|
|
180 |
|
subscriptions.push_back(subs); |
181 |
} |
} |
182 |
|
|
183 |
|
|
198 |
} |
} |
199 |
|
|
200 |
MidiInputDeviceAlsa::~MidiInputDeviceAlsa() { |
MidiInputDeviceAlsa::~MidiInputDeviceAlsa() { |
201 |
snd_seq_close(hAlsaSeq); |
// free the midi ports (we can't let the base class do this, |
202 |
|
// as the MidiInputPortAlsa destructors need access to |
203 |
|
// hAlsaSeq) |
204 |
|
for (std::map<int,MidiInputPort*>::iterator iter = Ports.begin(); iter != Ports.end() ; iter++) { |
205 |
|
delete static_cast<MidiInputPortAlsa*>(iter->second); |
206 |
|
} |
207 |
|
Ports.clear(); |
208 |
|
|
209 |
|
snd_seq_close(hAlsaSeq); |
210 |
} |
} |
211 |
|
|
212 |
MidiInputDeviceAlsa::MidiInputPortAlsa* MidiInputDeviceAlsa::CreateMidiPort() { |
MidiInputDeviceAlsa::MidiInputPortAlsa* MidiInputDeviceAlsa::CreateMidiPort() { |
234 |
} |
} |
235 |
|
|
236 |
String MidiInputDeviceAlsa::Version() { |
String MidiInputDeviceAlsa::Version() { |
237 |
String s = "$Revision: 1.16 $"; |
String s = "$Revision: 1.22 $"; |
238 |
return s.substr(11, s.size() - 13); // cut dollar signs, spaces and CVS macro keyword |
return s.substr(11, s.size() - 13); // cut dollar signs, spaces and CVS macro keyword |
239 |
} |
} |
240 |
|
|
255 |
|
|
256 |
switch (ev->type) { |
switch (ev->type) { |
257 |
case SND_SEQ_EVENT_CONTROLLER: |
case SND_SEQ_EVENT_CONTROLLER: |
258 |
|
if (ev->data.control.param == 0) |
259 |
|
pMidiInputPort->DispatchBankSelectMsb(ev->data.control.value, ev->data.control.channel); |
260 |
|
else if (ev->data.control.param == 32) |
261 |
|
pMidiInputPort->DispatchBankSelectLsb(ev->data.control.value, ev->data.control.channel); |
262 |
pMidiInputPort->DispatchControlChange(ev->data.control.param, ev->data.control.value, ev->data.control.channel); |
pMidiInputPort->DispatchControlChange(ev->data.control.param, ev->data.control.value, ev->data.control.channel); |
263 |
break; |
break; |
264 |
|
|
265 |
|
case SND_SEQ_EVENT_CHANPRESS: |
266 |
|
pMidiInputPort->DispatchControlChange(128, ev->data.control.value, ev->data.control.channel); |
267 |
|
break; |
268 |
|
|
269 |
case SND_SEQ_EVENT_PITCHBEND: |
case SND_SEQ_EVENT_PITCHBEND: |
270 |
pMidiInputPort->DispatchPitchbend(ev->data.control.value, ev->data.control.channel); |
pMidiInputPort->DispatchPitchbend(ev->data.control.value, ev->data.control.channel); |
271 |
break; |
break; |
295 |
} while (snd_seq_event_input_pending(hAlsaSeq, 0) > 0); |
} while (snd_seq_event_input_pending(hAlsaSeq, 0) > 0); |
296 |
} |
} |
297 |
} |
} |
298 |
|
// just to avoid a compiler warning |
299 |
|
return EXIT_FAILURE; |
300 |
} |
} |
301 |
|
|
302 |
} // namespace LinuxSampler |
} // namespace LinuxSampler |