1 //此类用于定义音频信息相关的全局函数 2 #pragma once 3 #include "SongInfo.h" 4 5 //音频文件类型 6 enum AudioType 7 { 8 AU_MP3, 9 AU_WMA_ASF, 10 AU_OGG, 11 AU_MP4, 12 AU_AAC, 13 AU_APE, 14 AU_AIFF, 15 AU_FLAC, 16 AU_CUE, 17 AU_MIDI, 18 AU_WAV, 19 AU_MPC, 20 AU_DSD, 21 AU_OPUS, 22 AU_WV, 23 AU_SPX, 24 AU_TTA, 25 AU_OTHER 26 }; 27 28 29 // ID3v1 tag structure 30 struct TAG_ID3V1 31 { 32 char id[3]; 33 char title[30]; 34 char artist[30]; 35 char album[30]; 36 char year[4]; 37 char comment[28]; 38 BYTE track[2]; 39 BYTE genre; 40 }; 41 42 //循环模式 43 enum RepeatMode 44 { 45 RM_PLAY_ORDER, //顺序播放 46 RM_PLAY_SHUFFLE, //无序播放 47 RM_PLAY_RANDOM, //随机播放 48 RM_LOOP_PLAYLIST, //列表循环 49 RM_LOOP_TRACK, //单曲循环 50 RM_PLAY_TRACK, //单曲播放 51 RM_MAX 52 }; 53 54 // 读取音频文件元数据方法GetAudioInfo和GetCueTracks的刷新级别 55 enum MediaLibRefreshMode 56 { 57 MR_MIN_REQUIRED, // 仅获取不存在于媒体库的条目(最小化文件读取,最快但不保证最新) 58 MR_FILE_MODIFICATION, // 重新获取修改时间与媒体库记录不同的条目(需要读取修改时间略耗时) 59 MR_FOECE_FULL // 强制重新获取所有条目 60 }; 61 62 63 struct SupportedFormat //一种支持的音频文件格式 64 { 65 wstring file_name; //插件的文件名 66 wstring description; //文件格式的描述 67 wstring extensions_list; //文件扩展名列表(格式形如:*.mp3;*.wav) 68 vector<wstring> extensions; //文件格式的扩展名(不含圆点) 69 void CreateExtensionsList(); //根据extensions中的内容生成文件扩展名列表,保存到extensions_list中 70 }; 71 72 class CAudioCommon 73 { 74 public: 75 CAudioCommon(); 76 ~CAudioCommon(); 77 78 //判断文件类型是否为音频文件 79 static bool FileIsAudio(const wstring& file_name); 80 81 //根据文件名判断文件的类型 82 static AudioType GetAudioTypeByFileExtension(const wstring& ext); 83 static AudioType GetAudioTypeByFileName(const wstring& file_name); 84 85 //根据一个文件扩展名判断音频类型的描述 86 static wstring GetAudioDescriptionByExtension(wstring extension); 87 88 // 查找path目录下的所有音频文件,并将文件路径保存到容器中,并限定最大文件数为max_file (识别osu!的Songs文件夹) 89 static void GetAudioFiles(wstring path, std::vector<SongInfo>& files, size_t max_file = 20000, bool include_sub_dir = false); 90 // 查找path目录下的所有音频文件,并将文件路径保存到容器中,并限定最大文件数为max_file (识别osu!的Songs文件夹) 91 static void GetAudioFiles(wstring path, std::vector<std::wstring>& files, size_t max_file = 20000, bool include_sub_dir = false); 92 93 //判断一个目录下是否包含音频文件 (对osu!的Songs文件夹返回true) 94 static bool IsPathContainsAudioFile(std::wstring path, bool include_sub_dir = false); 95 96 //查找path目录下的所有歌词文件,并将文件名保存到files容器中 97 static void GetLyricFiles(wstring path, vector<wstring>& files); 98 99 // 处理files内所有cue相关条目的获取信息/拆分/移除关联音频,更新信息到媒体库,仅维护files到可转换SongDataMapKey的程度 100 static void GetCueTracks(vector<SongInfo>& files, int& update_cnt, bool& exit_flag, MediaLibRefreshMode refresh_mode); 101 // 处理files内所有条目的获取信息,更新到媒体库(内部调用GetCueTracks),仅维护files到可转换SongDataMapKey的程度 102 // ignore_short为true时不保存短歌曲到媒体库且会移除files中的短歌曲(不包含cue) 103 static void GetAudioInfo(vector<SongInfo>& files, int& update_cnt, bool& exit_flag, int& process_percent, MediaLibRefreshMode refresh_mode, bool ignore_short = false); 104 105 //获得标准流派信息 106 static wstring GetGenre(BYTE genre); 107 108 //遍历标准流派信息。(如果sort为true,则按字母顺序遍历) 109 static void EmulateGenre(std::function<void(const wstring&)> fun, bool sort); 110 111 //获得一个流派在标准流派中的索引 112 static int GenreIndex(const wstring& genre); 113 114 //将标签中数字表示的流派信息转换成标准流派信息 115 static wstring GenreConvert(wstring genre); 116 117 //删除一个字符串中非打印字符开始的后面全部字符 118 static void TagStrNormalize(wstring& str); 119 120 //获取一个BASS通道类型的描述 121 static wstring GetBASSChannelDescription(DWORD ctype); 122 123 //根据BASS通道类型获取音频类型 124 static AudioType GetAudioTypeByBassChannel(DWORD ctype); 125 126 //将音轨序号转换成数字 127 static CString TrackToString(BYTE track); 128 129 //返回一个SupportedFormat 130 //exts: 格式的扩展名,多个扩展名用空格分隔 131 //description:格式的描述 132 //file_name: 插件的文件名 133 static SupportedFormat CreateSupportedFormat(const wchar_t* exts, const wchar_t* description, const wchar_t* file_name = L""); 134 135 //返回一个SupportedFormat 136 //exts: 格式的扩展名 137 //description:格式的描述 138 //file_name: 插件的文件名 139 static SupportedFormat CreateSupportedFormat(const std::vector<std::wstring>& exts, const wchar_t* description, const wchar_t* file_name = L""); 140 141 public: 142 static vector<SupportedFormat> m_surpported_format; //支持的文件格式 143 static vector<wstring> m_all_surpported_extensions; //全部支持的文件格式扩展名 144 145 protected: 146 static void CheckCueAudioPath(vector<SongInfo>& files); 147 }; 148