/[svn]/linuxsampler/trunk/src/drivers/midi/MidiInputDeviceAlsa.cpp
ViewVC logotype

Diff of /linuxsampler/trunk/src/drivers/midi/MidiInputDeviceAlsa.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 880 by schoenebeck, Tue Jun 27 22:57:37 2006 UTC revision 1715 by schoenebeck, Tue Mar 11 15:20:46 2008 UTC
# Line 3  Line 3 
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  *
# Line 86  namespace LinuxSampler { Line 86  namespace LinuxSampler {
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      }      }
# Line 130  namespace LinuxSampler { Line 139  namespace LinuxSampler {
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);
# Line 156  namespace LinuxSampler { Line 166  namespace LinuxSampler {
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    
# Line 184  namespace LinuxSampler { Line 198  namespace LinuxSampler {
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() {
# Line 212  namespace LinuxSampler { Line 234  namespace LinuxSampler {
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    
# Line 233  namespace LinuxSampler { Line 255  namespace LinuxSampler {
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;
# Line 265  namespace LinuxSampler { Line 295  namespace LinuxSampler {
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

Legend:
Removed from v.880  
changed lines
  Added in v.1715

  ViewVC Help
Powered by ViewVC