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