xref: /MusicPlayer2/MusicPlayer2/SongDataManager.h (revision d116564c7d2fbe11e6f90b13943d206ca3e2cd40)
1 #pragma once
2 #include "SongInfo.h"
3 
4 class CSongDataManager
5 {
6 public:
7     ~CSongDataManager();
8 
9     using SongDataMap = std::unordered_map<SongKey, SongInfo>;
10 
11     static CSongDataManager& GetInstance();
12     void SaveSongData(std::wstring path);       //将所有歌曲信息以序列化的方式保存到文件
13     void LoadSongData(std::wstring path);       //从文件中以序列化的方式读取所有歌曲信息
14 
15     bool IsSongDataModified() const;
16 
17     CString GetDataVersion() const;
18 
19     // 设置歌曲ID
20     bool SetSongID(const SongKey& key, const unsigned __int64 id);
21     // 获取歌曲ID
22     bool GetSongID(const SongKey& key, unsigned __int64& id) const;
23 
24     // CAudioCommon::GetCueTracks用来将获取的信息存入媒体库(专用,其他位置多半不合适)
25     void SaveCueSongInfo(const vector<SongInfo>& songs_info);
26     // 从媒体库加载信息更新到播放列表项目(仅加载播放列表需要的属性)
27     void LoadSongInfo(SongInfo& song_info) const;
28     void LoadSongsInfo(vector<SongInfo>& song_info) const;
29 
30     // 获取一个媒体库歌曲信息(不存在会返回和参数song一致的SongInfo)
31     // 至少要保证用于查询的file_path,is_cue,track是正确的
32     // 用于修改媒体库的歌曲属性,修改后需使用CSongDataManager::AddItem保存
33     SongInfo GetSongInfo3(const SongInfo& song) const;
34 
35     SongInfo GetSongInfo(const SongKey& key) const;
36 
37     // 用于外部读取m_song_data,加读锁后以const m_song_data&为参数调用func
38     // 请勿在func中试图修改媒体库以避免未定义行为
39     void GetSongData(const std::function<void(const CSongDataManager::SongDataMap&)>& func) const;
40 
41     bool IsItemExist(const SongKey& key) const;
42     void AddItem(const SongInfo& song);
43     bool RemoveItem(const SongKey& key);
44     // 删除符合条件的项目,返回已删除个数
45     int RemoveItemIf(std::function<bool(const SongInfo&)> fun_condition);
46 
47     void ClearPlayTime();       //清除播放时间统计数据
48     void ClearLastPlayedTime();     //清除上次播放时间
49 
50     // 创建旧媒体库条目的新路径副本(不能用于cue文件)
51     void ChangeFilePath(const wstring& file_path, const wstring& new_path);
52 
53 private:
54     CSongDataManager();
55 
56     static CSongDataManager m_instance;
57 
58 private:
59     SongDataMap m_song_data;        //储存所有歌曲信息数据的映射容器,键是每一个音频文件的绝对路径,对象是每一个音频文件的信息
60     std::atomic<bool> m_song_data_modified{ false };
61     CString m_data_version;
62     // 用于保证m_song_data读写的线程安全,遍历/查找加读锁,添加/删除加写锁
63     mutable std::shared_mutex m_shared_mutex;   // 线程同步对象
64 };
65