xref: /MusicPlayer2/MusicPlayer2/FfmpegCore.h (revision 8959a120c2c1a8b30f887255062f37449f37dee8)
1 #pragma once
2 #include "IPlayerCore.h"
3 #include "DllLib.h"
4 
5 #define AV_LOG_ERROR 16
6 #define AV_LOG_INFO 32
7 #define AV_LOG_VERBOSE 40
8 #define AV_LOG_SKIP_REPEATED 1
9 #define AV_LOG_PRINT_LEVEL 2
10 #define FFMPEG_CORE_VERSION(major, minor, micro, rev) (((int32_t)major << 24) | ((int32_t)minor << 16) | ((int32_t)micro << 8) | (int32_t)rev)
11 typedef struct MusicHandle MusicHandle;
12 typedef struct MusicInfoHandle MusicInfoHandle;
13 typedef struct FfmpegCoreSettings FfmpegCoreSettings;
14 typedef struct DeviceNameList {
15     char* device;
16     struct DeviceNameList* prev;
17     struct DeviceNameList* next;
18 } DeviceNameList;
19 typedef void(*_free_music_handle)(MusicHandle*);
20 typedef void(*_free_music_info_handle)(MusicInfoHandle*);
21 typedef void(*_free_ffmpeg_core_settings)(FfmpegCoreSettings*);
22 typedef void(*_free_device_name_list)(DeviceNameList**);
23 typedef void(*_ffmpeg_core_free)(void*);
24 typedef void*(*_ffmpeg_core_malloc)(size_t);
25 typedef void*(*_ffmpeg_core_realloc)(void*, size_t);
26 typedef int(*_ffmpeg_core_log_format_line)(void* ptr, int level, const char* fmt, va_list vl, char* line, int line_size, int* print_prefix);
27 typedef void(*_ffmpeg_core_log_set_callback)(void(*callback)(void*, int, const char*, va_list));
28 typedef void(*_ffmpeg_core_log_set_flags)(int);
29 typedef const char*(*_ffmpeg_core_version_str)();
30 typedef int32_t(*_ffmpeg_core_version)();
31 typedef int(*_ffmpeg_core_is_wasapi_supported)();
32 typedef void(*_ffmpeg_core_dump_library_version)(int, int);
33 typedef void(*_ffmpeg_core_dump_ffmpeg_configuration)(int, int);
34 typedef int(*_ffmpeg_core_open)(const wchar_t*, MusicHandle**);
35 typedef int(*_ffmpeg_core_open2)(const wchar_t*, MusicHandle**, FfmpegCoreSettings*);
36 typedef int(*_ffmpeg_core_open3)(const wchar_t*, MusicHandle**, FfmpegCoreSettings*, const wchar_t*);
37 typedef int(*_ffmpeg_core_info_open)(const wchar_t*, MusicInfoHandle**);
38 typedef int(*_ffmpeg_core_play)(MusicHandle*);
39 typedef int(*_ffmpeg_core_pause)(MusicHandle*);
40 typedef int(*_ffmpeg_core_seek)(MusicHandle*, int64_t);
41 typedef int(*_ffmpeg_core_set_volume)(MusicHandle*, int);
42 typedef int(*_ffmpeg_core_set_speed)(MusicHandle*, float);
43 typedef int(*_ffmpeg_core_set_equalizer_channel)(MusicHandle*, int, int);
44 typedef int(*_ffmpeg_core_get_error)(MusicHandle*);
45 typedef wchar_t*(*_ffmpeg_core_get_err_msg)(int);
46 typedef const wchar_t*(*_ffmpeg_core_get_err_msg2)(int);
47 typedef int64_t(*_ffmpeg_core_get_cur_position)(MusicHandle*);
48 typedef int(*_ffmpeg_core_song_is_over)(MusicHandle*);
49 typedef int64_t(*_ffmpeg_core_get_song_length)(MusicHandle*);
50 typedef int64_t(*_ffmpeg_core_info_get_song_length)(MusicInfoHandle*);
51 typedef int(*_ffmpeg_core_get_channels)(MusicHandle*);
52 typedef int(*_ffmpeg_core_info_get_channels)(MusicInfoHandle*);
53 typedef int(*_ffmpeg_core_get_freq)(MusicHandle*);
54 typedef int(*_ffmpeg_core_info_get_freq)(MusicInfoHandle*);
55 typedef int(*_ffmpeg_core_is_playing)(MusicHandle*);
56 typedef int(*_ffmpeg_core_get_bits)(MusicHandle*);
57 typedef int(*_ffmpeg_core_info_get_bits)(MusicInfoHandle*);
58 typedef int64_t(*_ffmpeg_core_get_bitrate)(MusicHandle*);
59 typedef int64_t(*_ffmpeg_core_info_get_bitrate)(MusicInfoHandle*);
60 typedef wchar_t*(*_ffmpeg_core_get_metadata)(MusicHandle*, const char* key);
61 typedef wchar_t*(*_ffmpeg_core_info_get_metadata)(MusicInfoHandle*, const char* key);
62 typedef int(*_ffmpeg_core_get_fft_data)(MusicHandle*, float*, int);
63 typedef FfmpegCoreSettings*(*_ffmpeg_core_init_settings)();
64 typedef int(*_ffmpeg_core_settings_set_volume)(FfmpegCoreSettings*, int volume);
65 typedef int(*_ffmpeg_core_settings_set_speed)(FfmpegCoreSettings*, float);
66 typedef int(*_ffmpeg_core_settings_set_cache_length)(FfmpegCoreSettings*, int);
67 typedef int(*_ffmpeg_core_settings_set_max_retry_count)(FfmpegCoreSettings*, int);
68 typedef int(*_ffmpeg_core_settings_set_url_retry_interval)(FfmpegCoreSettings*, int);
69 typedef int(*_ffmpeg_core_settings_set_equalizer_channel)(FfmpegCoreSettings*, int, int);
70 typedef int(*_ffmpeg_core_settings_set_use_WASAPI)(FfmpegCoreSettings*, int);
71 typedef int(*_ffmpeg_core_settings_set_enable_exclusive)(FfmpegCoreSettings*, int);
72 typedef int(*_ffmpeg_core_settings_set_max_wait_time)(FfmpegCoreSettings*, int);
73 typedef DeviceNameList*(*_ffmpeg_core_get_audio_devices)();
74 
75 class CFfmpegCore : public IPlayerCore, public CDllLib {
76 public:
77     CFfmpegCore();
78     ~CFfmpegCore();
79     virtual void InitCore() override;
80     virtual void UnInitCore() override;
81     virtual std::wstring GetAudioType() override;
82     virtual int GetChannels() override;
83     virtual int GetFReq() override;
84     virtual std::wstring GetSoundFontName() override;
85     virtual void Open(const wchar_t* file_path) override;
86     virtual void Close() override;
87     virtual void Play() override;
88     virtual void Pause() override;
89     virtual void Stop() override;
90     virtual void SetVolume(int volume) override;
91     virtual void SetSpeed(float speed) override;
92     virtual void SetPitch(int pitch) override;
93     virtual bool SongIsOver() override;
94     virtual int GetCurPosition() override;
95     virtual int GetSongLength() override;
96     virtual void SetCurPosition(int position) override;
97     virtual void GetAudioInfo(SongInfo& song_info, int flag = AF_LENGTH | AF_BITRATE | AF_TAG_INFO) override;
98     virtual void GetAudioInfo(const wchar_t* file_path, SongInfo& song_info, int flag = AF_LENGTH | AF_BITRATE | AF_TAG_INFO) override;
99     virtual bool IsMidi() override;
100     virtual bool IsMidiConnotPlay() override;
101     virtual MidiInfo GetMidiInfo() override;
102     virtual std::wstring GetMidiInnerLyric() override;
103     virtual bool MidiNoLyric() override;
104     virtual PlayingState GetPlayingState() override;
105     virtual void ApplyEqualizer(int channel, int gain) override;
106     virtual void SetReverb(int mix, int time) override;
107     virtual void ClearReverb() override;
108     virtual void GetFFTData(float fft_data[FFT_SAMPLE]) override;
109     virtual int GetErrorCode() override;
110     virtual std::wstring GetErrorInfo(int error_code) override;
111     virtual std::wstring GetErrorInfo() override;
112     virtual PlayerCoreType GetCoreType() override;
113     std::wstring GetTitle(MusicInfoHandle* h = nullptr);
114     std::wstring GetArtist(MusicInfoHandle* h = nullptr);
115     std::wstring GetAlbum(MusicInfoHandle* h = nullptr);
116     std::wstring GetComment(MusicInfoHandle* h = nullptr);
117     std::wstring GetGenre(MusicInfoHandle* h = nullptr);
118     std::wstring GetDate(MusicInfoHandle* h = nullptr);
119     unsigned short GetYear(MusicInfoHandle* h = nullptr);
120     std::wstring GetTrack(MusicInfoHandle* h = nullptr);
121     int GetTrackNum(MusicInfoHandle* h = nullptr);
122     void UpdateSettings();
123     void SetCacheLength(int cache_length = 15);
124     void SetMaxRetryCount(int max_retry_count = 3);
125     void SetUrlRetryInterval(int url_retry_interval = 5);
126     std::list<std::wstring> GetAudioDevices();
127     int32_t GetVersion();
128     bool IsWASAPISupported();
129     void EnableWASAPI(bool enable);
130     void EnableExclusiveMode(bool enable);
131     void SetMaxWaitTime(int max_wait_time = 3000);
132 
133     virtual bool EncodeAudio(SongInfo song_info, const wstring& dest_file_path, EncodeFormat encode_format, void* encode_para, int dest_freq, EncodeAudioProc proc) override;
134     virtual bool InitEncoder() override;
135     virtual void UnInitEncoder() override;
136     virtual bool IsFreqConvertAvailable() override;
137 
138 private:
139     std::wstring GetMetadata(std::string key, MusicInfoHandle* h = nullptr);
140     virtual bool GetFunction() override;
141     static void LogCallback(void*, int, const char*, va_list);
142     _free_music_handle free_music_handle = nullptr;
143     _free_music_info_handle free_music_info_handle = nullptr;
144     _free_ffmpeg_core_settings free_ffmpeg_core_settings = nullptr;
145     _free_device_name_list free_device_name_list = nullptr;
146     _ffmpeg_core_free ffmpeg_core_free = nullptr;
147     _ffmpeg_core_malloc ffmpeg_core_malloc = nullptr;
148     _ffmpeg_core_realloc ffmpeg_core_realloc = nullptr;
149     _ffmpeg_core_log_format_line ffmpeg_core_log_format_line = nullptr;
150     _ffmpeg_core_log_set_callback ffmpeg_core_log_set_callback = nullptr;
151     _ffmpeg_core_log_set_flags ffmpeg_core_log_set_flags = nullptr;
152     _ffmpeg_core_version_str ffmpeg_core_version_str = nullptr;
153     _ffmpeg_core_version ffmpeg_core_version = nullptr;
154     _ffmpeg_core_is_wasapi_supported ffmpeg_core_is_wasapi_supported = nullptr;
155     _ffmpeg_core_dump_library_version ffmpeg_core_dump_library_version = nullptr;
156     _ffmpeg_core_dump_ffmpeg_configuration ffmpeg_core_dump_ffmpeg_configuration = nullptr;
157     _ffmpeg_core_open ffmpeg_core_open = nullptr;
158     _ffmpeg_core_open2 ffmpeg_core_open2 = nullptr;
159     _ffmpeg_core_open3 ffmpeg_core_open3 = nullptr;
160     _ffmpeg_core_info_open ffmpeg_core_info_open = nullptr;
161     _ffmpeg_core_play ffmpeg_core_play = nullptr;
162     _ffmpeg_core_pause ffmpeg_core_pause = nullptr;
163     _ffmpeg_core_seek ffmpeg_core_seek = nullptr;
164     _ffmpeg_core_set_volume ffmpeg_core_set_volume = nullptr;
165     _ffmpeg_core_set_speed ffmpeg_core_set_speed = nullptr;
166     _ffmpeg_core_set_equalizer_channel ffmpeg_core_set_equalizer_channel = nullptr;
167     _ffmpeg_core_get_error ffmpeg_core_get_error = nullptr;
168     _ffmpeg_core_get_err_msg ffmpeg_core_get_err_msg = nullptr;
169     _ffmpeg_core_get_err_msg2 ffmpeg_core_get_err_msg2 = nullptr;
170     _ffmpeg_core_get_cur_position ffmpeg_core_get_cur_position = nullptr;
171     _ffmpeg_core_song_is_over ffmpeg_core_song_is_over = nullptr;
172     _ffmpeg_core_get_song_length ffmpeg_core_get_song_length = nullptr;
173     _ffmpeg_core_info_get_song_length ffmpeg_core_info_get_song_length = nullptr;
174     _ffmpeg_core_get_channels ffmpeg_core_get_channels = nullptr;
175     _ffmpeg_core_info_get_channels ffmpeg_core_info_get_channels = nullptr;
176     _ffmpeg_core_get_freq ffmpeg_core_get_freq = nullptr;
177     _ffmpeg_core_info_get_freq ffmpeg_core_info_get_freq = nullptr;
178     _ffmpeg_core_is_playing ffmpeg_core_is_playing = nullptr;
179     _ffmpeg_core_get_bits ffmpeg_core_get_bits = nullptr;
180     _ffmpeg_core_info_get_bits ffmpeg_core_info_get_bits = nullptr;
181     _ffmpeg_core_get_bitrate ffmpeg_core_get_bitrate = nullptr;
182     _ffmpeg_core_info_get_bitrate ffmpeg_core_info_get_bitrate = nullptr;
183     _ffmpeg_core_get_metadata ffmpeg_core_get_metadata = nullptr;
184     _ffmpeg_core_info_get_metadata ffmpeg_core_info_get_metadata = nullptr;
185     _ffmpeg_core_get_fft_data ffmpeg_core_get_fft_data = nullptr;
186     _ffmpeg_core_init_settings ffmpeg_core_init_settings = nullptr;
187     _ffmpeg_core_settings_set_volume ffmpeg_core_settings_set_volume = nullptr;
188     _ffmpeg_core_settings_set_speed ffmpeg_core_settings_set_speed = nullptr;
189     _ffmpeg_core_settings_set_cache_length ffmpeg_core_settings_set_cache_length = nullptr;
190     _ffmpeg_core_settings_set_max_retry_count ffmpeg_core_settings_set_max_retry_count = nullptr;
191     _ffmpeg_core_settings_set_url_retry_interval ffmpeg_core_settings_set_url_retry_interval = nullptr;
192     _ffmpeg_core_settings_set_equalizer_channel ffmpeg_core_settings_set_equalizer_channel = nullptr;
193     _ffmpeg_core_settings_set_use_WASAPI ffmpeg_core_settings_set_use_WASAPI = nullptr;
194     _ffmpeg_core_settings_set_enable_exclusive ffmpeg_core_settings_set_enable_exclusive = nullptr;
195     _ffmpeg_core_settings_set_max_wait_time ffmpeg_core_settings_set_max_wait_time = nullptr;
196     _ffmpeg_core_get_audio_devices ffmpeg_core_get_audio_devices = nullptr;
197     int GetEqChannelFreq(int channel);
198     MusicHandle* handle;
199     FfmpegCoreSettings* settings = nullptr;
200     std::wstring recent_file;
201     int err;
202     int32_t version;
203 };
204