| @@ -20,6 +20,8 @@ | |||||
| * - implement sample rate changes | * - implement sample rate changes | ||||
| * - call outDev->ReconnectAll() after changing buffer size or sample rate | * - call outDev->ReconnectAll() after changing buffer size or sample rate | ||||
| * - use CARLA_SAFE_ASSERT_RETURN with err | * - use CARLA_SAFE_ASSERT_RETURN with err | ||||
| * - pianoteq-like SetNoteOnVelocityFilter drawing points widget | |||||
| * - voice count param | |||||
| */ | */ | ||||
| #include "CarlaPluginInternal.hpp" | #include "CarlaPluginInternal.hpp" | ||||
| #include "CarlaEngine.hpp" | #include "CarlaEngine.hpp" | ||||
| @@ -99,7 +101,7 @@ public: | |||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| bool isAutonomousDevice() override { return false; } | |||||
| /* */ bool isAutonomousDevice() override { return false; } | |||||
| static bool isAutonomousDriver() { return false; } | static bool isAutonomousDriver() { return false; } | ||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| @@ -125,7 +127,7 @@ private: | |||||
| class MidiInputPortPlugin : public MidiInputPort | class MidiInputPortPlugin : public MidiInputPort | ||||
| { | { | ||||
| public: | public: | ||||
| MidiInputPortPlugin(MidiInputDevice* const device, const int portNum) | |||||
| MidiInputPortPlugin(MidiInputDevice* const device, const int portNum = 0) | |||||
| : MidiInputPort(device, portNum), | : MidiInputPort(device, portNum), | ||||
| leakDetector_MidiInputPortPlugin() {} | leakDetector_MidiInputPortPlugin() {} | ||||
| @@ -162,31 +164,14 @@ public: | |||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| bool isAutonomousDevice() override { return false; } | |||||
| /* */ bool isAutonomousDevice() override { return false; } | |||||
| static bool isAutonomousDriver() { return false; } | static bool isAutonomousDriver() { return false; } | ||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| MidiInputPortPlugin* CreateMidiPortPlugin() | |||||
| { | |||||
| return new MidiInputPortPlugin(this, int(Ports.size())); | |||||
| } | |||||
| CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(MidiInputDevicePlugin) | CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(MidiInputDevicePlugin) | ||||
| }; | }; | ||||
| // ----------------------------------------------------------------------- | |||||
| // SamplerPlugin | |||||
| struct SamplerPlugin { | |||||
| Sampler sampler; | |||||
| MidiInputDevicePlugin midiIn; | |||||
| SamplerPlugin() | |||||
| : sampler(), | |||||
| midiIn(&sampler) {} | |||||
| }; | |||||
| } // namespace LinuxSampler | } // namespace LinuxSampler | ||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| @@ -210,11 +195,12 @@ public: | |||||
| fLabel(nullptr), | fLabel(nullptr), | ||||
| fMaker(nullptr), | fMaker(nullptr), | ||||
| fRealName(nullptr), | fRealName(nullptr), | ||||
| sSampler(), | |||||
| fAudioOutputDevice(nullptr), | fAudioOutputDevice(nullptr), | ||||
| fMidiInputDevice(sSampler), | |||||
| fMidiInputPort(nullptr), | fMidiInputPort(nullptr), | ||||
| fInstrument(nullptr), | fInstrument(nullptr), | ||||
| fInstrumentIds(), | fInstrumentIds(), | ||||
| sSampler(), | |||||
| leakDetector_CarlaPluginLinuxSampler() | leakDetector_CarlaPluginLinuxSampler() | ||||
| { | { | ||||
| carla_debug("CarlaPluginLinuxSampler::CarlaPluginLinuxSampler(%p, %i, %s, %s)", engine, id, bool2str(isGIG), bool2str(use16Outs)); | carla_debug("CarlaPluginLinuxSampler::CarlaPluginLinuxSampler(%p, %i, %s, %s)", engine, id, bool2str(isGIG), bool2str(use16Outs)); | ||||
| @@ -1166,34 +1152,38 @@ public: | |||||
| // Init LinuxSampler stuff | // Init LinuxSampler stuff | ||||
| fAudioOutputDevice = new LinuxSampler::AudioOutputDevicePlugin(pData->engine, this, kUses16Outs); | fAudioOutputDevice = new LinuxSampler::AudioOutputDevicePlugin(pData->engine, this, kUses16Outs); | ||||
| fMidiInputPort = sSampler->midiIn.CreateMidiPortPlugin(); | |||||
| fMidiInputDevice = new LinuxSampler::MidiInputDevicePlugin(sSampler); | |||||
| fMidiInputPort = new LinuxSampler::MidiInputPortPlugin(fMidiInputDevice); | |||||
| for (uint i=0; i<kMaxChannels; ++i) | for (uint i=0; i<kMaxChannels; ++i) | ||||
| { | { | ||||
| fSamplerChannels[i] = sSampler->sampler.AddSamplerChannel(); | |||||
| fSamplerChannels[i] = sSampler->AddSamplerChannel(); | |||||
| CARLA_SAFE_ASSERT_CONTINUE(fSamplerChannels[i] != nullptr); | CARLA_SAFE_ASSERT_CONTINUE(fSamplerChannels[i] != nullptr); | ||||
| fSamplerChannels[i]->SetEngineType(kIsGIG ? "GIG" : "SFZ"); | fSamplerChannels[i]->SetEngineType(kIsGIG ? "GIG" : "SFZ"); | ||||
| fSamplerChannels[i]->SetAudioOutputDevice(fAudioOutputDevice); | fSamplerChannels[i]->SetAudioOutputDevice(fAudioOutputDevice); | ||||
| fEngineChannels[i] = fSamplerChannels[i]->GetEngineChannel(); | |||||
| CARLA_SAFE_ASSERT_CONTINUE(fEngineChannels[i] != nullptr); | |||||
| LinuxSampler::EngineChannel* const engineChannel(fSamplerChannels[i]->GetEngineChannel()); | |||||
| CARLA_SAFE_ASSERT_CONTINUE(engineChannel != nullptr); | |||||
| // TODO REMOVE | |||||
| fEngineChannels[i] = engineChannel; | |||||
| fEngineChannels[i]->Pan(0.0f); | |||||
| fEngineChannels[i]->Volume(kIsGIG ? LinuxSampler::kVolumeMax/10.0f : LinuxSampler::kVolumeMax); // FIXME | |||||
| fEngineChannels[i]->Connect(fAudioOutputDevice); | |||||
| engineChannel->Pan(0.0f); | |||||
| engineChannel->Volume(kIsGIG ? LinuxSampler::kVolumeMax/10.0f : LinuxSampler::kVolumeMax); // FIXME | |||||
| engineChannel->Connect(fAudioOutputDevice); | |||||
| if (kUses16Outs) | if (kUses16Outs) | ||||
| { | { | ||||
| fEngineChannels[i]->SetOutputChannel(0, i*2); | |||||
| fEngineChannels[i]->SetOutputChannel(1, i*2 +1); | |||||
| fMidiInputPort->Connect(fEngineChannels[i], static_cast<LinuxSampler::midi_chan_t>(i)); | |||||
| engineChannel->SetOutputChannel(0, i*2); | |||||
| engineChannel->SetOutputChannel(1, i*2 +1); | |||||
| fMidiInputPort->Connect(engineChannel, static_cast<LinuxSampler::midi_chan_t>(i)); | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| fEngineChannels[i]->SetOutputChannel(0, 0); | |||||
| fEngineChannels[i]->SetOutputChannel(1, 1); | |||||
| fMidiInputPort->Connect(fEngineChannels[i], LinuxSampler::midi_chan_all); | |||||
| engineChannel->SetOutputChannel(0, 0); | |||||
| engineChannel->SetOutputChannel(1, 1); | |||||
| fMidiInputPort->Connect(engineChannel, LinuxSampler::midi_chan_all); | |||||
| } | } | ||||
| } | } | ||||
| @@ -1305,16 +1295,17 @@ private: | |||||
| int32_t fCurProgs[MAX_MIDI_CHANNELS]; | int32_t fCurProgs[MAX_MIDI_CHANNELS]; | ||||
| LinuxSampler::SamplerChannel* fSamplerChannels[MAX_MIDI_CHANNELS]; | |||||
| LinuxSampler::EngineChannel* fEngineChannels[MAX_MIDI_CHANNELS]; | |||||
| SharedResourcePointer<LinuxSampler::Sampler> sSampler; | |||||
| LinuxSampler::AudioOutputDevicePlugin* fAudioOutputDevice; | LinuxSampler::AudioOutputDevicePlugin* fAudioOutputDevice; | ||||
| LinuxSampler::MidiInputDevicePlugin* fMidiInputDevice; | |||||
| LinuxSampler::MidiInputPortPlugin* fMidiInputPort; | LinuxSampler::MidiInputPortPlugin* fMidiInputPort; | ||||
| LinuxSampler::InstrumentManager* fInstrument; | |||||
| std::vector<LinuxSampler::InstrumentManager::instrument_id_t> fInstrumentIds; | |||||
| LinuxSampler::SamplerChannel* fSamplerChannels[MAX_MIDI_CHANNELS]; | |||||
| LinuxSampler::EngineChannel* fEngineChannels[MAX_MIDI_CHANNELS]; // TODO remove | |||||
| SharedResourcePointer<LinuxSampler::SamplerPlugin> sSampler; | |||||
| /* */ LinuxSampler::InstrumentManager* fInstrument; | |||||
| std::vector<LinuxSampler::InstrumentManager::instrument_id_t> fInstrumentIds; | |||||
| CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaPluginLinuxSampler) | CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaPluginLinuxSampler) | ||||
| }; | }; | ||||