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 - 2009 Christian Schoenebeck * |
* Copyright (C) 2005 - 2010 Christian Schoenebeck * |
7 |
* * |
* * |
8 |
* This library is free software; you can redistribute it and/or modify * |
* This library 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 * |
88 |
|
|
89 |
// dereference midi input port. |
// dereference midi input port. |
90 |
MidiInputPort* pMidiInputPort = __GetMidiInputDevicePort(GetMidiInputPort()); |
MidiInputPort* pMidiInputPort = __GetMidiInputDevicePort(GetMidiInputPort()); |
91 |
|
midi_chan_t midiChannel = GetMidiInputChannel(); |
92 |
// disconnect old engine channel |
// disconnect old engine channel |
93 |
if (pEngineChannel) { |
if (pEngineChannel) { |
94 |
Engine* engine = pEngineChannel->GetEngine(); |
Engine* engine = pEngineChannel->GetEngine(); |
108 |
pNewEngineChannel->Connect(pAudioOutputDevice); |
pNewEngineChannel->Connect(pAudioOutputDevice); |
109 |
pAudioOutputDevice->Connect(pNewEngineChannel->GetEngine()); |
pAudioOutputDevice->Connect(pNewEngineChannel->GetEngine()); |
110 |
} |
} |
111 |
if (pMidiInputPort) pMidiInputPort->Connect(pNewEngineChannel, GetMidiInputChannel()); |
if (pMidiInputPort) pMidiInputPort->Connect(pNewEngineChannel, midiChannel); |
112 |
pEngineChannel = pNewEngineChannel; |
pEngineChannel = pNewEngineChannel; |
113 |
|
|
114 |
// from now on get MIDI device and port from EngineChannel object |
// from now on get MIDI device and port from EngineChannel object |
120 |
dmsg(2,("OK\n")); |
dmsg(2,("OK\n")); |
121 |
} |
} |
122 |
|
|
123 |
void SamplerChannel::SetAudioOutputDevice(AudioOutputDevice* pDevice) { |
void SamplerChannel::SetAudioOutputDevice(AudioOutputDevice* pDevice) throw (Exception) { |
124 |
if(pAudioOutputDevice == pDevice) return; |
if(pAudioOutputDevice == pDevice) return; |
125 |
|
|
126 |
// disconnect old device |
// disconnect old device |
127 |
if (pAudioOutputDevice && pEngineChannel) { |
if (pAudioOutputDevice && pEngineChannel) { |
128 |
|
if (!pAudioOutputDevice->isAutonomousDevice()) |
129 |
|
throw Exception("The audio output device '" + pAudioOutputDevice->Driver() + "' cannot be dropped from this sampler channel!"); |
130 |
|
|
131 |
Engine* engine = pEngineChannel->GetEngine(); |
Engine* engine = pEngineChannel->GetEngine(); |
132 |
pAudioOutputDevice->Disconnect(engine); |
pAudioOutputDevice->Disconnect(engine); |
133 |
|
|
146 |
} |
} |
147 |
} |
} |
148 |
|
|
149 |
void SamplerChannel::SetMidiInputDevice(MidiInputDevice* pDevice) { |
void SamplerChannel::SetMidiInputDevice(MidiInputDevice* pDevice) throw (Exception) { |
150 |
SetMidiInput(pDevice, 0, GetMidiInputChannel()); |
SetMidiInput(pDevice, 0, GetMidiInputChannel()); |
151 |
} |
} |
152 |
|
|
153 |
void SamplerChannel::SetMidiInputPort(int MidiPort) { |
void SamplerChannel::SetMidiInputPort(int MidiPort) throw (Exception) { |
154 |
SetMidiInput(GetMidiInputDevice(), MidiPort, GetMidiInputChannel()); |
SetMidiInput(GetMidiInputDevice(), MidiPort, GetMidiInputChannel()); |
155 |
} |
} |
156 |
|
|
158 |
SetMidiInput(GetMidiInputDevice(), GetMidiInputPort(), MidiChannel); |
SetMidiInput(GetMidiInputDevice(), GetMidiInputPort(), MidiChannel); |
159 |
} |
} |
160 |
|
|
161 |
void SamplerChannel::SetMidiInput(MidiInputDevice* pDevice, int iMidiPort, midi_chan_t MidiChannel) { |
void SamplerChannel::SetMidiInput(MidiInputDevice* pDevice, int iMidiPort, midi_chan_t MidiChannel) throw (Exception) { |
162 |
if (!pDevice) throw Exception("No MIDI input device assigned."); |
if (!pDevice) throw Exception("No MIDI input device assigned."); |
163 |
|
|
164 |
// get old and new midi input port |
// get old and new midi input port |
166 |
MidiInputPort* pNewMidiInputPort = pDevice->GetPort(iMidiPort); |
MidiInputPort* pNewMidiInputPort = pDevice->GetPort(iMidiPort); |
167 |
|
|
168 |
// disconnect old device port |
// disconnect old device port |
169 |
if (pOldMidiInputPort && pEngineChannel) pOldMidiInputPort->Disconnect(pEngineChannel); |
if (pOldMidiInputPort && pEngineChannel) { |
170 |
|
MidiInputDevice* pOldDevice = pOldMidiInputPort->GetDevice(); |
171 |
|
if (pOldMidiInputPort != pNewMidiInputPort && |
172 |
|
pOldDevice && !pOldDevice->isAutonomousDevice() |
173 |
|
) throw Exception("The MIDI input port '" + pOldDevice->Driver() + "' cannot be altered on this sampler channel!"); |
174 |
|
|
175 |
|
pOldMidiInputPort->Disconnect(pEngineChannel); |
176 |
|
} |
177 |
|
|
178 |
// remember new device, port and channel if not engine channel yet created |
// remember new device, port and channel if not engine channel yet created |
179 |
if (!pEngineChannel) { |
if (!pEngineChannel) { |
180 |
this->pMidiInputDevice = pDevice; |
this->pMidiInputDevice = pDevice; |