文章目录

该类管理并访问音乐资料库(本地+远程),定义于src/musikcore/library/LibraryFactory.h

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
class LibraryFactory {
public:
using LibraryVector = std::vector<ILibraryPtr>;
using LibraryMap = std::map<int, ILibraryPtr>;
/* 使用sigslot库传递消息,减少对象之间的耦合性 */
using LibrariesUpdatedEvent = sigslot::signal0<>;
using IMessageQueue = mymusic::core::runtime::IMessageQueue;
/* 传递消息的发送端 */
LibrariesUpdatedEvent LibrariesUpdated;
/* 不做任何操作 */
~LibraryFactory();
/* 设置消息队列 */
static void Initialize(IMessageQueue& messageQueue);
/* 单例懒汉模式 */
static LibraryFactory& Instance();
/* 依次关闭每个资料库,再关闭向量libraries与Map libraryMap */
static void Shutdown();
/* 返回默认本地音乐资料库的指针 */
ILibraryPtr DefaultLocalLibrary();
/* 返回默认远程音乐资料库的指针 */
ILibraryPtr DefaultRemoteLibrary();
/* 返回type类型对应的默认音乐资料库 */
ILibraryPtr DefaultLibrary(ILibrary::Type type);
/* 返回libraries成员 */
LibraryVector Libraries();
/* 先判断类型为type,名为name的音乐资料库是否已创建,若已创建且未被删除,则返回此资料库的指针即可
* 若已创建但被删除,则重新调用AddLibrary创建;若之前从未创建此资料库,则为其分配一个唯一的id,并创建资料库 */
ILibraryPtr CreateLibrary(const std::string& name, ILibrary::Type type);
/* 根据id获取对应的资料库 */
ILibraryPtr GetLibrary(int identifier);

private:
/* 调用CreateLibrary创建名为default-local-library的本地音乐资料库与名为default-remote-library的远程音乐资料库 */
LibraryFactory();
/* 调用type类型资料库类的Create函数创建资料库,并存入libraries,然后通知LibrariesUpdated连接到的接收者
* 最后返回资料库的指针 */
ILibraryPtr AddLibrary(int id, ILibrary::Type type, const std::string& name);
/* 存储资料库 */
LibraryVector libraries;
/* 维护id与资料库的映射关系 */
LibraryMap libraryMap;
};

关于CreateLibrary,其主要部分是根据情况调用LocalLibrary类或RemoteLibrary类的Create函数,下面详细介绍LocalLibrary类与RemoteLibrary类