--- linuxsampler/trunk/src/mididriver/MidiInputDevice.cpp 2004/06/27 13:53:11 152 +++ linuxsampler/trunk/src/mididriver/MidiInputDevice.cpp 2004/06/28 04:21:11 153 @@ -24,48 +24,124 @@ namespace LinuxSampler { - MidiInputDevice::MidiInputDevice(type_t Type) { - MidiInputType = Type; + MidiInputDevice::MidiInputDevice(std::map DriverParameters) { + this->Parameters = DriverParameters; } - void MidiInputDevice::DispatchNoteOn(uint8_t Key, uint8_t Velocity, uint MidiChannel) { + MidiInputDevice::~MidiInputDevice() { + std::map::iterator iter = Parameters.begin(); + while (iter != Parameters.end()) { + Parameters.erase(iter); + delete iter->second; + iter++; + } + } + + std::map MidiInputDevice::AvailableParameters() { + static const std::map available_parameters = CreateAvailableParameters(); + return available_parameters; + } + + std::map MidiInputDevice::CreateAvailableParameters() { + static ParameterActive param_active(NULL); + static ParameterPorts param_ports(NULL); + std::map result; + result["active"] = ¶m_active; + result["ports"] = ¶m_ports; + return result; + } + + MidiInputDevice::MidiInputPort::~MidiInputPort() { + std::map::iterator iter = Parameters.begin(); + while (iter != Parameters.end()) { + Parameters.erase(iter); + delete iter->second; + iter++; + } + } + + MidiInputDevice* MidiInputDevice::MidiInputPort::GetDevice() { + return pDevice; + } + + uint MidiInputDevice::MidiInputPort::GetPortNumber() { + return portNumber; + } + + std::map MidiInputDevice::MidiInputPort::AvailableParameters() { + static const std::map available_parameters = CreateAvailableParameters(); + return available_parameters; + } + + std::map MidiInputDevice::MidiInputPort::CreateAvailableParameters() { + static ParameterName param_name(NULL); + std::map result; + result["name"] = ¶m_name; + return result; + } + + std::map MidiInputDevice::DeviceParameters() { + return Parameters; + } + + std::map MidiInputDevice::MidiInputPort::DeviceParameters() { + return Parameters; + } + + void MidiInputDevice::MidiInputPort::DispatchNoteOn(uint8_t Key, uint8_t Velocity, uint MidiChannel) { std::set::iterator engineiter = MidiChannelMap[MidiChannel].begin(); std::set::iterator end = MidiChannelMap[MidiChannel].end(); for (; engineiter != end; engineiter++) (*engineiter)->SendNoteOn(Key, Velocity); } - void MidiInputDevice::DispatchNoteOff(uint8_t Key, uint8_t Velocity, uint MidiChannel) { + void MidiInputDevice::MidiInputPort::DispatchNoteOff(uint8_t Key, uint8_t Velocity, uint MidiChannel) { std::set::iterator engineiter = MidiChannelMap[MidiChannel].begin(); std::set::iterator end = MidiChannelMap[MidiChannel].end(); for (; engineiter != end; engineiter++) (*engineiter)->SendNoteOff(Key, Velocity); } - void MidiInputDevice::DispatchPitchbend(int Pitch, uint MidiChannel) { + void MidiInputDevice::MidiInputPort::DispatchPitchbend(int Pitch, uint MidiChannel) { std::set::iterator engineiter = MidiChannelMap[MidiChannel].begin(); std::set::iterator end = MidiChannelMap[MidiChannel].end(); for (; engineiter != end; engineiter++) (*engineiter)->SendPitchbend(Pitch); } - void MidiInputDevice::DispatchControlChange(uint8_t Controller, uint8_t Value, uint MidiChannel) { + void MidiInputDevice::MidiInputPort::DispatchControlChange(uint8_t Controller, uint8_t Value, uint MidiChannel) { std::set::iterator engineiter = MidiChannelMap[MidiChannel].begin(); std::set::iterator end = MidiChannelMap[MidiChannel].end(); for (; engineiter != end; engineiter++) (*engineiter)->SendControlChange(Controller, Value); } - void MidiInputDevice::Connect(Engine* pEngine, midi_chan_t MidiChannel) { + void MidiInputDevice::MidiInputPort::Connect(Engine* pEngine, midi_chan_t MidiChannel) { if (MidiChannel < 0 || MidiChannel > 16) throw MidiInputException("MIDI channel index out of bounds"); Disconnect(pEngine); MidiChannelMap[MidiChannel].insert(pEngine); } - void MidiInputDevice::Disconnect(Engine* pEngine) { + void MidiInputDevice::MidiInputPort::Disconnect(Engine* pEngine) { try { for (int i = 0; i <= 16; i++) MidiChannelMap[i].erase(pEngine); } catch(...) { /* NOOP */ } } - MidiInputDevice::type_t MidiInputDevice::Type() { - return MidiInputType; + void MidiInputDevice::AcquirePorts(uint newPorts) { + int diff = this->Ports.size() - newPorts; + if (!diff) + return; //Number of ports matches already, nothing to do. + + while (diff != 0) { + if (diff > 0) { //We've got too many ports, remove one + std::map::iterator portsIter = Ports.end(); + Ports.erase(--portsIter); + delete portsIter->second; + diff--; + } + if (diff < 0) { //We don't have enough ports, create one + MidiInputPort* midiPort = this->CreateMidiPort(); + Ports[midiPort->portNumber] = midiPort; + diff++; + } + } } } // namespace LinuxSampler