coming
天行健 君子以自强不息
记录我的成长
前言 为更方便地理解muscikcube这个项目,我下载muscikcube的standalone_linux版 ,是muscikcube源码在Linux平台下编译出的bin文件夹。
根目录下的文件如下
1 lib libmusikcore.so locales musikcube musikcubed plugins share themes
plugins文件夹下就是项目中各个插件对应的动态链接库。
1 2 libalsaout.so libgmedecoder.so libnullout.so libpipewireout.so libserver.so libsupereqdsp.so libffmpegdecoder.so libhttpdatastream.so libopenmptdecoder.so libpulseout.so libstockencoders.so libtaglibreader.so
plugin命名空间 plugin是项目中很重要的一个命名空间,其中的函数完成对plugins文件夹下的动态链接库的加载。
plugin命名空间的定义如下(src/musikcore/plugin/Plugins.h)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 namespace musik { namespace core { namespace plugin { void Init () ; void Start ( musik::core::runtime::IMessageQueue* messageQueue, musik::core::sdk::IPlaybackService* playback, musik::core::ILibraryPtr library) ; musik::core::sdk::IEnvironment& Environment () ; void Deinit () ; } } }
该命名空间中有三个函数:Init、Start与Deinit。
Init函数 1 2 3 4 5 6 7 8 9 10 11 void Init () { Preferences::LoadPluginPreferences(); PluginFactory::Instance().QueryFunction<SetDebug>( "SetDebug" , [](mymusic::core::sdk::IPlugin* plugin, SetDebug func) { func(&debugger); }); }
plugin::Init函数在客户端/服务端启动时运行,初始化项目插件。其主要内容就是加载各插件的属性值,通过调用类Preferences的LoadPluginPreferences函数完成。
Start函数 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 void Start (IMessageQueue* messageQueue, IPlaybackService* playbackService, ILibraryPtr library) { delete metadataProxy; ::messageQueue = messageQueue; ::defaultLibrary = library; ::playbackService = playbackService; ::playbackPrefs = Preferences::ForComponent(prefs::components::Playback); ::metadataProxy = new LocalMetadataProxy(LibraryFactory::Instance().DefaultLocalLibrary()); PluginFactory::Instance().QueryFunction<SetMetadataProxy>( "SetMetadataProxy" , [](mymusic::core::sdk::IPlugin* plugin, SetMetadataProxy func) { func(metadataProxy); }); IIndexerNotifier* indexerNotifier = dynamic_cast <IIndexerNotifier*>(library->Indexer()); PluginFactory::Instance().QueryFunction<SetIndexerNotifier>( "SetIndexerNotifier" , [indexerNotifier](mymusic::core::sdk::IPlugin* plugin, SetIndexerNotifier func) { func(indexerNotifier); }); PluginFactory::Instance().QueryFunction<SetEnvironment>( "SetEnvironment" , [](mymusic::core::sdk::IPlugin* plugin, SetEnvironment func) { func(&environment); }); }
Start函数完成一些设置。整个程序的运行由EvMessageQueue类的对象messageQueue的Run函数带动。
本文代表个人观点,内容仅供参考。若有不恰当之处,望不吝赐教!