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