Updated ISynthesizer interface with "params" method and according notification
This commit is contained in:
parent
f40fac564d
commit
6159767e77
11 changed files with 81 additions and 25 deletions
|
@ -50,17 +50,17 @@ FluidResolver::FluidResolver(const io::paths& soundFontDirs, async::Channel<io::
|
|||
});
|
||||
}
|
||||
|
||||
ISynthesizerPtr FluidResolver::resolveSynth(const TrackId /*trackId*/, const AudioResourceId& resourceId) const
|
||||
ISynthesizerPtr FluidResolver::resolveSynth(const TrackId /*trackId*/, const AudioInputParams& params) const
|
||||
{
|
||||
ONLY_AUDIO_WORKER_THREAD;
|
||||
|
||||
ISynthesizerPtr synth = std::make_shared<FluidSynth>();
|
||||
ISynthesizerPtr synth = std::make_shared<FluidSynth>(params);
|
||||
synth->init();
|
||||
|
||||
auto search = m_resourcesCache.find(resourceId);
|
||||
auto search = m_resourcesCache.find(params.resourceMeta.id);
|
||||
|
||||
if (search == m_resourcesCache.end()) {
|
||||
LOGE() << "Not found: " << resourceId;
|
||||
LOGE() << "Not found: " << params.resourceMeta.id;
|
||||
return synth;
|
||||
}
|
||||
|
||||
|
|
|
@ -40,7 +40,7 @@ class FluidResolver : public ISynthResolver::IResolver, public async::Asyncable
|
|||
public:
|
||||
explicit FluidResolver(const io::paths& soundFontDirs, async::Channel<io::paths> sfDirsChanges);
|
||||
|
||||
ISynthesizerPtr resolveSynth(const audio::TrackId trackId, const audio::AudioResourceId& resourceId) const override;
|
||||
ISynthesizerPtr resolveSynth(const audio::TrackId trackId, const audio::AudioInputParams& params) const override;
|
||||
audio::AudioResourceMetaList resolveResources() const override;
|
||||
|
||||
void refresh() override;
|
||||
|
|
|
@ -56,8 +56,9 @@ struct mu::audio::synth::Fluid {
|
|||
}
|
||||
};
|
||||
|
||||
FluidSynth::FluidSynth()
|
||||
FluidSynth::FluidSynth(const AudioSourceParams& params)
|
||||
{
|
||||
m_params = params;
|
||||
m_fluid = std::make_shared<Fluid>();
|
||||
}
|
||||
|
||||
|
@ -76,6 +77,16 @@ AudioSourceType FluidSynth::type() const
|
|||
return AudioSourceType::Fluid;
|
||||
}
|
||||
|
||||
const AudioInputParams& FluidSynth::params() const
|
||||
{
|
||||
return m_params;
|
||||
}
|
||||
|
||||
async::Channel<AudioInputParams> FluidSynth::paramsChanged() const
|
||||
{
|
||||
return m_paramsChanges;
|
||||
}
|
||||
|
||||
SoundFontFormats FluidSynth::soundFontFormats() const
|
||||
{
|
||||
return { SoundFontFormat::SF2, SoundFontFormat::SF3 };
|
||||
|
|
|
@ -37,12 +37,14 @@ struct Fluid;
|
|||
class FluidSynth : public ISynthesizer
|
||||
{
|
||||
public:
|
||||
FluidSynth();
|
||||
FluidSynth(const audio::AudioSourceParams& params);
|
||||
|
||||
bool isValid() const override;
|
||||
|
||||
std::string name() const override;
|
||||
AudioSourceType type() const override;
|
||||
const audio::AudioInputParams& params() const override;
|
||||
async::Channel<audio::AudioInputParams> paramsChanged() const override;
|
||||
SoundFontFormats soundFontFormats() const override;
|
||||
|
||||
Ret init() override;
|
||||
|
@ -92,6 +94,8 @@ private:
|
|||
bool m_isActive = false;
|
||||
|
||||
unsigned int m_sampleRate = 0;
|
||||
audio::AudioInputParams m_params;
|
||||
async::Channel<audio::AudioInputParams> m_paramsChanges;
|
||||
async::Channel<unsigned int> m_streamsCountChanged;
|
||||
};
|
||||
|
||||
|
|
|
@ -50,7 +50,7 @@ ISynthesizerPtr SynthResolver::resolveSynth(const TrackId trackId, const AudioIn
|
|||
|
||||
TRACEFUNC;
|
||||
|
||||
IF_ASSERT_FAILED(params.isValid()) {
|
||||
if (!params.isValid()) {
|
||||
LOGE() << "invalid audio source params for trackId: " << trackId;
|
||||
return nullptr;
|
||||
}
|
||||
|
@ -64,7 +64,7 @@ ISynthesizerPtr SynthResolver::resolveSynth(const TrackId trackId, const AudioIn
|
|||
}
|
||||
|
||||
const IResolverPtr& resolver = search->second;
|
||||
return resolver->resolveSynth(trackId, params.resourceMeta.id);
|
||||
return resolver->resolveSynth(trackId, params);
|
||||
}
|
||||
|
||||
ISynthesizerPtr SynthResolver::resolveDefaultSynth(const TrackId trackId) const
|
||||
|
|
|
@ -23,10 +23,13 @@
|
|||
#ifndef MU_AUDIO_ISYNTHESIZER_H
|
||||
#define MU_AUDIO_ISYNTHESIZER_H
|
||||
|
||||
#include "async/channel.h"
|
||||
#include "io/path.h"
|
||||
#include "ret.h"
|
||||
#include "synthtypes.h"
|
||||
#include "midi/miditypes.h"
|
||||
|
||||
#include "synthtypes.h"
|
||||
#include "audiotypes.h"
|
||||
#include "iaudiosource.h"
|
||||
|
||||
namespace mu::audio::synth {
|
||||
|
@ -39,6 +42,8 @@ public:
|
|||
|
||||
virtual std::string name() const = 0;
|
||||
virtual AudioSourceType type() const = 0;
|
||||
virtual const audio::AudioInputParams& params() const = 0;
|
||||
virtual async::Channel<audio::AudioInputParams> paramsChanged() const = 0;
|
||||
virtual SoundFontFormats soundFontFormats() const = 0;
|
||||
|
||||
virtual Ret init() = 0;
|
||||
|
|
|
@ -43,7 +43,7 @@ public:
|
|||
public:
|
||||
virtual ~IResolver() = default;
|
||||
|
||||
virtual ISynthesizerPtr resolveSynth(const audio::TrackId trackId, const audio::AudioResourceId& resourceId) const = 0;
|
||||
virtual ISynthesizerPtr resolveSynth(const audio::TrackId trackId, const audio::AudioInputParams& params) const = 0;
|
||||
virtual audio::AudioResourceMetaList resolveResources() const = 0;
|
||||
virtual void refresh() = 0;
|
||||
};
|
||||
|
|
|
@ -28,11 +28,11 @@ using namespace mu::vst;
|
|||
using namespace mu::audio;
|
||||
using namespace mu::audio::synth;
|
||||
|
||||
ISynthesizerPtr VstiResolver::resolveSynth(const audio::TrackId trackId, const audio::AudioResourceId& resourceId) const
|
||||
ISynthesizerPtr VstiResolver::resolveSynth(const audio::TrackId trackId, const audio::AudioInputParams& params) const
|
||||
{
|
||||
SynthPair& pair = m_synthMap[trackId];
|
||||
|
||||
if (pair.first == resourceId) {
|
||||
if (pair.first == params.resourceMeta.id) {
|
||||
return pair.second;
|
||||
}
|
||||
|
||||
|
@ -40,7 +40,7 @@ ISynthesizerPtr VstiResolver::resolveSynth(const audio::TrackId trackId, const a
|
|||
pluginsRegister()->unregisterInstrPlugin(trackId, pair.first);
|
||||
}
|
||||
|
||||
pair.second = createSynth(trackId, resourceId);
|
||||
pair.second = createSynth(trackId, params);
|
||||
|
||||
return pair.second;
|
||||
}
|
||||
|
@ -50,18 +50,20 @@ void VstiResolver::refresh()
|
|||
pluginModulesRepo()->refresh();
|
||||
}
|
||||
|
||||
VstSynthPtr VstiResolver::createSynth(const audio::TrackId trackId, const audio::AudioResourceId& resourceId) const
|
||||
VstSynthPtr VstiResolver::createSynth(const audio::TrackId trackId, const audio::AudioInputParams& params) const
|
||||
{
|
||||
PluginModulePtr modulePtr = pluginModulesRepo()->pluginModule(resourceId);
|
||||
PluginModulePtr modulePtr = pluginModulesRepo()->pluginModule(params.resourceMeta.id);
|
||||
|
||||
IF_ASSERT_FAILED(modulePtr) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
VstPluginPtr pluginPtr = std::make_shared<VstPlugin>(modulePtr);
|
||||
pluginsRegister()->registerInstrPlugin(trackId, resourceId, pluginPtr);
|
||||
pluginsRegister()->registerInstrPlugin(trackId, params.resourceMeta.id, pluginPtr);
|
||||
|
||||
std::shared_ptr<VstSynthesiser> synth = std::make_shared<VstSynthesiser>(std::move(pluginPtr));
|
||||
pluginPtr->load();
|
||||
|
||||
std::shared_ptr<VstSynthesiser> synth = std::make_shared<VstSynthesiser>(std::move(pluginPtr), params);
|
||||
synth->init();
|
||||
|
||||
return synth;
|
||||
|
|
|
@ -38,12 +38,12 @@ class VstiResolver : public audio::synth::ISynthResolver::IResolver
|
|||
INJECT(vst, IVstModulesRepository, pluginModulesRepo)
|
||||
INJECT(vst, IVstPluginsRegister, pluginsRegister)
|
||||
public:
|
||||
audio::synth::ISynthesizerPtr resolveSynth(const audio::TrackId trackId, const audio::AudioResourceId& resourceId) const override;
|
||||
audio::synth::ISynthesizerPtr resolveSynth(const audio::TrackId trackId, const audio::AudioInputParams& params) const override;
|
||||
audio::AudioResourceMetaList resolveResources() const override;
|
||||
void refresh() override;
|
||||
|
||||
private:
|
||||
VstSynthPtr createSynth(const audio::TrackId trackId, const audio::AudioResourceId& resourceId) const;
|
||||
VstSynthPtr createSynth(const audio::TrackId trackId, const audio::AudioInputParams ¶ms) const;
|
||||
|
||||
using SynthPair = std::pair<audio::AudioResourceId, VstSynthPtr>;
|
||||
|
||||
|
|
|
@ -28,8 +28,8 @@
|
|||
using namespace mu;
|
||||
using namespace mu::vst;
|
||||
|
||||
VstSynthesiser::VstSynthesiser(VstPluginPtr&& pluginPtr)
|
||||
: m_pluginPtr(pluginPtr), m_vstAudioClient(std::make_unique<VstAudioClient>())
|
||||
VstSynthesiser::VstSynthesiser(VstPluginPtr&& pluginPtr, const audio::AudioInputParams& params)
|
||||
: m_pluginPtr(pluginPtr), m_vstAudioClient(std::make_unique<VstAudioClient>()), m_params(params)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -37,6 +37,23 @@ Ret VstSynthesiser::init()
|
|||
{
|
||||
m_vstAudioClient->init(VstPluginType::Instrument, m_pluginPtr);
|
||||
|
||||
if (m_pluginPtr->isLoaded()) {
|
||||
m_pluginPtr->updatePluginConfig(m_params.configuration);
|
||||
} else {
|
||||
m_pluginPtr->loadingCompleted().onNotify(this, [this]() {
|
||||
m_pluginPtr->updatePluginConfig(m_params.configuration);
|
||||
});
|
||||
}
|
||||
|
||||
m_pluginPtr->pluginSettingsChanged().onReceive(this, [this](const audio::AudioUnitConfig& newConfig) {
|
||||
if (m_params.configuration == newConfig) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_params.configuration = newConfig;
|
||||
m_paramsChanges.send(m_params);
|
||||
});
|
||||
|
||||
return make_ret(Ret::Code::Ok);
|
||||
}
|
||||
|
||||
|
@ -61,7 +78,7 @@ void VstSynthesiser::setIsActive(bool arg)
|
|||
|
||||
audio::AudioSourceType VstSynthesiser::type() const
|
||||
{
|
||||
return audio::AudioSourceType::Vsti;
|
||||
return m_params.type();
|
||||
}
|
||||
|
||||
std::string VstSynthesiser::name() const
|
||||
|
@ -73,6 +90,16 @@ std::string VstSynthesiser::name() const
|
|||
return m_pluginPtr->name();
|
||||
}
|
||||
|
||||
const audio::AudioInputParams& VstSynthesiser::params() const
|
||||
{
|
||||
return m_params;
|
||||
}
|
||||
|
||||
async::Channel<audio::AudioInputParams> VstSynthesiser::paramsChanged() const
|
||||
{
|
||||
return m_paramsChanges;
|
||||
}
|
||||
|
||||
audio::synth::SoundFontFormats VstSynthesiser::soundFontFormats() const
|
||||
{
|
||||
NOT_SUPPORTED;
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
|
||||
#include <memory>
|
||||
|
||||
#include "async/asyncable.h"
|
||||
#include "audio/isynthesizer.h"
|
||||
#include "audio/iaudioconfiguration.h"
|
||||
#include "audio/audiotypes.h"
|
||||
|
@ -36,14 +37,14 @@
|
|||
#include "vsttypes.h"
|
||||
|
||||
namespace mu::vst {
|
||||
class VstSynthesiser : public audio::synth::ISynthesizer
|
||||
class VstSynthesiser : public audio::synth::ISynthesizer, public async::Asyncable
|
||||
{
|
||||
INJECT(vst, IVstPluginsRegister, pluginsRegister)
|
||||
INJECT(vst, IVstModulesRepository, modulesRepo)
|
||||
INJECT(vst, audio::IAudioConfiguration, config)
|
||||
|
||||
public:
|
||||
explicit VstSynthesiser(VstPluginPtr&& pluginPtr);
|
||||
explicit VstSynthesiser(VstPluginPtr&& pluginPtr, const audio::AudioInputParams& params);
|
||||
|
||||
Ret init() override;
|
||||
|
||||
|
@ -54,6 +55,9 @@ public:
|
|||
audio::AudioSourceType type() const override;
|
||||
std::string name() const override;
|
||||
|
||||
const audio::AudioInputParams& params() const override;
|
||||
async::Channel<audio::AudioInputParams> paramsChanged() const override;
|
||||
|
||||
audio::synth::SoundFontFormats soundFontFormats() const override;
|
||||
Ret addSoundFonts(const std::vector<io::path>& sfonts) override;
|
||||
Ret removeSoundFonts() override;
|
||||
|
@ -81,6 +85,9 @@ private:
|
|||
|
||||
bool m_isActive = false;
|
||||
|
||||
audio::AudioInputParams m_params;
|
||||
|
||||
async::Channel<audio::AudioInputParams> m_paramsChanges;
|
||||
async::Channel<unsigned int> m_streamsCountChanged;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue