Updated ISynthesizer interface with "params" method and according notification

This commit is contained in:
vpereverzev 2021-09-29 12:20:02 +02:00 committed by pereverzev+v
parent f40fac564d
commit 6159767e77
11 changed files with 81 additions and 25 deletions

View file

@ -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;
}

View file

@ -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;

View file

@ -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 };

View file

@ -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;
};

View file

@ -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

View file

@ -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;

View file

@ -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;
};

View file

@ -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;

View file

@ -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 &params) const;
using SynthPair = std::pair<audio::AudioResourceId, VstSynthPtr>;

View file

@ -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;

View file

@ -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;
};