文章目录
  1. 前言
  2. plugin命名空间
  3. Init函数
  4. Start函数

前言

为更方便地理解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 */
Preferences::LoadPluginPreferences();

/* debug */
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) {
/* metadata proxies */
delete metadataProxy;
::messageQueue = messageQueue;
::defaultLibrary = library;
::playbackService = playbackService;
::playbackPrefs = Preferences::ForComponent(prefs::components::Playback);

/* even if the local client is connected to a remote server, the metadata proxy
always uses the default local library. */
::metadataProxy = new LocalMetadataProxy(LibraryFactory::Instance().DefaultLocalLibrary());

PluginFactory::Instance().QueryFunction<SetMetadataProxy>(
"SetMetadataProxy",
[](mymusic::core::sdk::IPlugin* plugin, SetMetadataProxy func) {
func(metadataProxy);
});

/* indexer */
IIndexerNotifier* indexerNotifier =
dynamic_cast<IIndexerNotifier*>(library->Indexer());

PluginFactory::Instance().QueryFunction<SetIndexerNotifier>(
"SetIndexerNotifier",
[indexerNotifier](mymusic::core::sdk::IPlugin* plugin, SetIndexerNotifier func) {
func(indexerNotifier);
});

/* environment */
PluginFactory::Instance().QueryFunction<SetEnvironment>(
"SetEnvironment",
[](mymusic::core::sdk::IPlugin* plugin, SetEnvironment func) {
func(&environment);
});
}

Start函数完成一些设置。整个程序的运行由EvMessageQueue类的对象messageQueue的Run函数带动。