/[svn]/linuxsampler/trunk/src/mididriver/MidiInputDevice.cpp
ViewVC logotype

Diff of /linuxsampler/trunk/src/mididriver/MidiInputDevice.cpp

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

revision 64 by schoenebeck, Thu May 6 20:06:20 2004 UTC revision 153 by senkov, Mon Jun 28 04:21:11 2004 UTC
# Line 24  Line 24 
24    
25  namespace LinuxSampler {  namespace LinuxSampler {
26    
27      MidiInputDevice::MidiInputDevice(type_t Type) {      MidiInputDevice::MidiInputDevice(std::map<String,DeviceCreationParameter*> DriverParameters) {
28          MidiInputType = Type;              this->Parameters = DriverParameters;
29      }      }
30    
31      void MidiInputDevice::DispatchNoteOn(uint8_t Key, uint8_t Velocity, uint MidiChannel) {      MidiInputDevice::~MidiInputDevice() {
32                std::map<String,DeviceCreationParameter*>::iterator iter = Parameters.begin();
33                while (iter != Parameters.end()) {
34                        Parameters.erase(iter);
35                        delete iter->second;
36                        iter++;
37                }
38        }
39    
40        std::map<String,DeviceCreationParameter*> MidiInputDevice::AvailableParameters() {
41                static const std::map<String,DeviceCreationParameter*> available_parameters = CreateAvailableParameters();
42                return available_parameters;
43        }
44                                                                                                                                                                
45        std::map<String,DeviceCreationParameter*> MidiInputDevice::CreateAvailableParameters() {
46                static ParameterActive     param_active(NULL);
47                static ParameterPorts      param_ports(NULL);
48                std::map<String,DeviceCreationParameter*> result;
49                result["active"]     = &param_active;
50                result["ports"]      = &param_ports;
51                return result;
52        }
53    
54        MidiInputDevice::MidiInputPort::~MidiInputPort() {
55                std::map<String,DeviceCreationParameter*>::iterator iter = Parameters.begin();
56                while (iter != Parameters.end()) {
57                        Parameters.erase(iter);
58                        delete iter->second;
59                        iter++;
60                }
61        }
62    
63        MidiInputDevice* MidiInputDevice::MidiInputPort::GetDevice() {
64                return pDevice;
65        }
66    
67        uint MidiInputDevice::MidiInputPort::GetPortNumber() {
68                return portNumber;
69        }
70    
71        std::map<String,DeviceCreationParameter*> MidiInputDevice::MidiInputPort::AvailableParameters() {
72                static const std::map<String,DeviceCreationParameter*> available_parameters = CreateAvailableParameters();
73                return available_parameters;
74        }
75                                                                                                                                                                
76        std::map<String,DeviceCreationParameter*> MidiInputDevice::MidiInputPort::CreateAvailableParameters() {
77                static ParameterName     param_name(NULL);
78                std::map<String,DeviceCreationParameter*> result;
79                result["name"]     = &param_name;
80                return result;
81        }
82    
83        std::map<String,DeviceCreationParameter*> MidiInputDevice::DeviceParameters() {
84                return Parameters;
85        }
86    
87        std::map<String,DeviceCreationParameter*> MidiInputDevice::MidiInputPort::DeviceParameters() {
88                return Parameters;
89        }
90    
91        void MidiInputDevice::MidiInputPort::DispatchNoteOn(uint8_t Key, uint8_t Velocity, uint MidiChannel) {
92          std::set<Engine*>::iterator engineiter = MidiChannelMap[MidiChannel].begin();          std::set<Engine*>::iterator engineiter = MidiChannelMap[MidiChannel].begin();
93          std::set<Engine*>::iterator end        = MidiChannelMap[MidiChannel].end();          std::set<Engine*>::iterator end        = MidiChannelMap[MidiChannel].end();
94          for (; engineiter != end; engineiter++) (*engineiter)->SendNoteOn(Key, Velocity);          for (; engineiter != end; engineiter++) (*engineiter)->SendNoteOn(Key, Velocity);
95      }      }
96    
97      void MidiInputDevice::DispatchNoteOff(uint8_t Key, uint8_t Velocity, uint MidiChannel) {      void MidiInputDevice::MidiInputPort::DispatchNoteOff(uint8_t Key, uint8_t Velocity, uint MidiChannel) {
98          std::set<Engine*>::iterator engineiter = MidiChannelMap[MidiChannel].begin();          std::set<Engine*>::iterator engineiter = MidiChannelMap[MidiChannel].begin();
99          std::set<Engine*>::iterator end        = MidiChannelMap[MidiChannel].end();          std::set<Engine*>::iterator end        = MidiChannelMap[MidiChannel].end();
100          for (; engineiter != end; engineiter++) (*engineiter)->SendNoteOff(Key, Velocity);          for (; engineiter != end; engineiter++) (*engineiter)->SendNoteOff(Key, Velocity);
101      }      }
102    
103      void MidiInputDevice::DispatchPitchbend(int Pitch, uint MidiChannel) {      void MidiInputDevice::MidiInputPort::DispatchPitchbend(int Pitch, uint MidiChannel) {
104          std::set<Engine*>::iterator engineiter = MidiChannelMap[MidiChannel].begin();          std::set<Engine*>::iterator engineiter = MidiChannelMap[MidiChannel].begin();
105          std::set<Engine*>::iterator end        = MidiChannelMap[MidiChannel].end();          std::set<Engine*>::iterator end        = MidiChannelMap[MidiChannel].end();
106          for (; engineiter != end; engineiter++) (*engineiter)->SendPitchbend(Pitch);          for (; engineiter != end; engineiter++) (*engineiter)->SendPitchbend(Pitch);
107      }      }
108    
109      void MidiInputDevice::DispatchControlChange(uint8_t Controller, uint8_t Value, uint MidiChannel) {      void MidiInputDevice::MidiInputPort::DispatchControlChange(uint8_t Controller, uint8_t Value, uint MidiChannel) {
110          std::set<Engine*>::iterator engineiter = MidiChannelMap[MidiChannel].begin();          std::set<Engine*>::iterator engineiter = MidiChannelMap[MidiChannel].begin();
111          std::set<Engine*>::iterator end        = MidiChannelMap[MidiChannel].end();          std::set<Engine*>::iterator end        = MidiChannelMap[MidiChannel].end();
112          for (; engineiter != end; engineiter++) (*engineiter)->SendControlChange(Controller, Value);          for (; engineiter != end; engineiter++) (*engineiter)->SendControlChange(Controller, Value);
113      }      }
114    
115      void MidiInputDevice::Connect(Engine* pEngine, midi_chan_t MidiChannel) {      void MidiInputDevice::MidiInputPort::Connect(Engine* pEngine, midi_chan_t MidiChannel) {
116          if (MidiChannel < 0 || MidiChannel > 16)          if (MidiChannel < 0 || MidiChannel > 16)
117              throw MidiInputException("MIDI channel index out of bounds");              throw MidiInputException("MIDI channel index out of bounds");
118          Disconnect(pEngine);          Disconnect(pEngine);
119          MidiChannelMap[MidiChannel].insert(pEngine);          MidiChannelMap[MidiChannel].insert(pEngine);
120      }      }
121    
122      void MidiInputDevice::Disconnect(Engine* pEngine) {      void MidiInputDevice::MidiInputPort::Disconnect(Engine* pEngine) {
123          try { for (int i = 0; i <= 16; i++) MidiChannelMap[i].erase(pEngine); }          try { for (int i = 0; i <= 16; i++) MidiChannelMap[i].erase(pEngine); }
124          catch(...) { /* NOOP */ }          catch(...) { /* NOOP */ }
125      }      }
126    
127      MidiInputDevice::type_t MidiInputDevice::Type() {      void MidiInputDevice::AcquirePorts(uint newPorts) {
128          return MidiInputType;           int diff = this->Ports.size() - newPorts;
129             if (!diff)
130                     return; //Number of ports matches already, nothing to do.
131    
132             while (diff != 0) {
133                     if (diff > 0) {        //We've got too many ports, remove one
134                             std::map<int,MidiInputPort*>::iterator portsIter = Ports.end();
135                             Ports.erase(--portsIter);
136                             delete portsIter->second;
137                             diff--;
138                     }
139                     if (diff < 0) {       //We don't have enough ports, create one
140                             MidiInputPort* midiPort = this->CreateMidiPort();
141                             Ports[midiPort->portNumber] = midiPort;
142                             diff++;
143                     }
144             }
145      }      }
146    
147  } // namespace LinuxSampler  } // namespace LinuxSampler

Legend:
Removed from v.64  
changed lines
  Added in v.153

  ViewVC Help
Powered by ViewVC