1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
#include "ExportPluginRegistry.h"
#include "ExportPlugin.h"
namespace {
const auto PathStart = L"Exporters";
}
auto ExportPluginRegistry::ExportPluginRegistryItem::Registry()
-> Registry::GroupItem<Traits> &
{
static Registry::GroupItem<Traits> registry{ PathStart };
return registry;
}
ExportPluginRegistry::ExportPluginRegistryItem::ExportPluginRegistryItem(
const Identifier &id, Factory factory )
: SingleItem{ id }
, mFactory{ std::move(factory) }
{}
ExportPluginRegistry::ExportPluginRegistry() = default;
ExportPluginRegistry::ConstIterator& ExportPluginRegistry::ConstIterator::operator++()
{
++mFormatIndex;
if(mFormatIndex >= (*mPluginIt)->GetFormatCount())
{
mFormatIndex = 0;
++mPluginIt;
}
return *this;
}
ExportPluginRegistry::~ExportPluginRegistry() = default;
ExportPluginRegistry::RegisteredPlugin::RegisteredPlugin(
const Identifier &id,
const Factory &factory,
const Registry::Placement &placement )
: RegisteredItem{
factory ? std::make_unique< ExportPluginRegistryItem >( id, factory ) : nullptr,
placement
}
{
}
ExportPluginRegistry& ExportPluginRegistry::Get()
{
static ExportPluginRegistry registry;
return registry;
}
void ExportPluginRegistry::Initialize()
{
using namespace Registry;
static OrderingPreferenceInitializer init{
PathStart,
{ {wxT(""), wxT("PCM,MP3,OGG,Opus,FLAC,WavPack,FFmpeg,MP2,CommandLine") } },
};
// visit the registry to collect the plug-ins properly
// sorted
GroupItem<Traits> top{ PathStart };
Registry::Visit(
[&](const ExportPluginRegistryItem &item, auto&){
mPlugins.emplace_back(item.mFactory()); },
&top, &ExportPluginRegistryItem::Registry());
}
std::tuple<ExportPlugin*, int>
ExportPluginRegistry::FindFormat(const wxString& format, bool compareWithCase) const
{
for(auto t: *this)
{
const auto [plugin, formatIndex] = t;
if(plugin->GetFormatInfo(formatIndex).format.IsSameAs(format, compareWithCase))
return t;
}
return {};
}
|