27 |
#include "PluginDssi.h" |
#include "PluginDssi.h" |
28 |
|
|
29 |
#include "../../engines/AbstractEngineChannel.h" |
#include "../../engines/AbstractEngineChannel.h" |
30 |
|
#include "../../engines/EngineChannelFactory.h" |
31 |
|
|
32 |
namespace { |
namespace { |
33 |
|
|
48 |
Out[0] = 0; |
Out[0] = 0; |
49 |
Out[1] = 0; |
Out[1] = 0; |
50 |
|
|
|
uint outputChannel = 0; |
|
|
uint midiPort = 0; |
|
51 |
if (!plugin) { |
if (!plugin) { |
52 |
plugin = new PluginDssi(SampleRate); |
plugin = new PluginDssi(SampleRate); |
53 |
} |
} |
56 |
pChannel = plugin->global->pSampler->AddSamplerChannel(); |
pChannel = plugin->global->pSampler->AddSamplerChannel(); |
57 |
pChannel->SetEngineType("gig"); |
pChannel->SetEngineType("gig"); |
58 |
pChannel->SetAudioOutputDevice(plugin->pAudioDevice); |
pChannel->SetAudioOutputDevice(plugin->pAudioDevice); |
|
pPort = plugin->pMidiDevice->CreateMidiPort(); |
|
|
pPort->Connect(pChannel->GetEngineChannel(), LinuxSampler::midi_chan_all); |
|
59 |
|
|
60 |
|
if (plugin->RefCount > 1) { |
61 |
|
plugin->pMidiDevice->AddMidiPort(); |
62 |
|
plugin->pAudioDevice->AddChannels(2); |
63 |
|
} |
64 |
|
|
65 |
|
int i = plugin->RefCount - 1; |
66 |
|
|
67 |
|
pChannel->SetMidiInput(plugin->pMidiDevice, i, LinuxSampler::midi_chan_all); |
68 |
LinuxSampler::AbstractEngineChannel* engineChannel = |
LinuxSampler::AbstractEngineChannel* engineChannel = |
69 |
static_cast<LinuxSampler::AbstractEngineChannel*>(pChannel->GetEngineChannel()); |
static_cast<LinuxSampler::AbstractEngineChannel*>(pChannel->GetEngineChannel()); |
70 |
// TODO: pChannelLeft and pChannelRight are meant to be |
engineChannel->SetOutputChannel(0, i * 2); |
71 |
// protected |
engineChannel->SetOutputChannel(1, i * 2 + 1); |
72 |
engineChannel->pChannelLeft = new LinuxSampler::AudioChannel(0, 0, 0); |
|
73 |
engineChannel->pChannelRight = new LinuxSampler::AudioChannel(1, 0, 0); |
pPort = plugin->pMidiDevice->GetPort(i); |
74 |
|
pChannelLeft = plugin->pAudioDevice->Channel(i * 2); |
75 |
|
pChannelRight = plugin->pAudioDevice->Channel(i * 2 + 1); |
76 |
} |
} |
77 |
|
|
78 |
PluginInstance::~PluginInstance() { |
PluginInstance::~PluginInstance() { |
|
LinuxSampler::AbstractEngineChannel* engineChannel = |
|
|
static_cast<LinuxSampler::AbstractEngineChannel*>(pChannel->GetEngineChannel()); |
|
|
delete engineChannel->pChannelLeft; |
|
|
delete engineChannel->pChannelRight; |
|
|
|
|
79 |
if (--plugin->RefCount == 0) { |
if (--plugin->RefCount == 0) { |
80 |
delete plugin; |
delete plugin; |
81 |
plugin = 0; |
plugin = 0; |
82 |
} else { |
} else { |
83 |
|
LinuxSampler::AbstractEngineChannel* engineChannel = |
84 |
|
static_cast<LinuxSampler::AbstractEngineChannel*>(pChannel->GetEngineChannel()); |
85 |
|
int oldChannelNumber = engineChannel->OutputChannel(0); |
86 |
|
|
87 |
plugin->global->pSampler->RemoveSamplerChannel(pChannel); |
plugin->global->pSampler->RemoveSamplerChannel(pChannel); |
88 |
|
plugin->pMidiDevice->RemoveMidiPort(pPort); |
89 |
|
plugin->pAudioDevice->RemoveChannel(pChannelLeft); |
90 |
|
plugin->pAudioDevice->RemoveChannel(pChannelRight); |
91 |
|
|
92 |
|
const std::set<LinuxSampler::EngineChannel*>& engineChannels = |
93 |
|
LinuxSampler::EngineChannelFactory::EngineChannelInstances(); |
94 |
|
for (std::set<LinuxSampler::EngineChannel*>::iterator i = engineChannels.begin(); |
95 |
|
i != engineChannels.end() ; ++i) { |
96 |
|
if ((*i)->GetAudioOutputDevice() == plugin->pAudioDevice) { |
97 |
|
int channelNumber = (*i)->OutputChannel(0); |
98 |
|
if (channelNumber > oldChannelNumber) { |
99 |
|
(*i)->SetOutputChannel(0, channelNumber - 2); |
100 |
|
(*i)->SetOutputChannel(1, channelNumber - 1); |
101 |
|
} |
102 |
|
} |
103 |
|
} |
104 |
} |
} |
|
|
|
|
LinuxSampler::MidiInputDevicePlugin::DeleteMidiPort(pPort); |
|
105 |
} |
} |
106 |
|
|
107 |
void PluginInstance::ConnectPort(unsigned long Port, LADSPA_Data* DataLocation) { |
void PluginInstance::ConnectPort(unsigned long Port, LADSPA_Data* DataLocation) { |
155 |
|
|
156 |
for (unsigned long i = 0 ; i < InstanceCount ; i++) { |
for (unsigned long i = 0 ; i < InstanceCount ; i++) { |
157 |
PluginInstance* instance = static_cast<PluginInstance*>(Instances[i]); |
PluginInstance* instance = static_cast<PluginInstance*>(Instances[i]); |
158 |
LinuxSampler::EngineChannel* engineChannel = |
LinuxSampler::MidiInputPort* port = instance->pPort; |
|
instance->pChannel->GetEngineChannel(); |
|
|
LinuxSampler::MidiInputPort* port = engineChannel->GetMidiInputPort(); |
|
159 |
|
|
160 |
snd_seq_event_t* events = Events[i]; |
snd_seq_event_t* events = Events[i]; |
161 |
unsigned& eventPos = eventPosArr[i]; |
unsigned& eventPos = eventPosArr[i]; |
199 |
} |
} |
200 |
} |
} |
201 |
|
|
202 |
LinuxSampler::AbstractEngineChannel* abstractEngineChannel = |
instance->pChannelLeft->SetBuffer(instance->Out[0] + samplePos); |
203 |
static_cast<LinuxSampler::AbstractEngineChannel*>(engineChannel); |
instance->pChannelRight->SetBuffer(instance->Out[1] + samplePos); |
|
abstractEngineChannel->pChannelLeft->SetBuffer(instance->Out[0] + samplePos); |
|
|
abstractEngineChannel->pChannelRight->SetBuffer(instance->Out[1] + samplePos); |
|
|
if (i) { |
|
|
abstractEngineChannel->pChannelLeft->Clear(samples); |
|
|
abstractEngineChannel->pChannelRight->Clear(samples); |
|
|
} else { |
|
|
// the buffer set in the audio device is cleared |
|
|
// by Render |
|
|
audioDevice->Channel(0)->SetBuffer(instance->Out[0] + samplePos); |
|
|
audioDevice->Channel(1)->SetBuffer(instance->Out[1] + samplePos); |
|
|
} |
|
204 |
} |
} |
205 |
|
|
206 |
audioDevice->Render(samples); |
audioDevice->Render(samples); |
212 |
|
|
213 |
void PluginInstance::Activate() { |
void PluginInstance::Activate() { |
214 |
dmsg(2, ("linuxsampler: activate instance=%p\n", static_cast<void*>(this))); |
dmsg(2, ("linuxsampler: activate instance=%p\n", static_cast<void*>(this))); |
215 |
pChannel->GetEngineChannel()->GetMidiInputPort()->DispatchControlChange(123, 0, 0, 0); // all sound off |
pPort->DispatchControlChange(123, 0, 0, 0); // all sound off |
216 |
} |
} |
217 |
|
|
218 |
|
|