xref: /MusicPlayer2/MusicPlayer2/AudioCommon.h (revision b02ea78914f3f3cea834525e3ae2052cd91d1e6d)
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