1 #pragma once 2 #include "IPlayerCore.h" 3 #include "bass.h" 4 #include "BASSMidiLibrary.h" 5 #include "Time.h" 6 #include "BASSEncodeLibrary.h" 7 #include "BASSWmaLibrary.h" 8 #include "BassMixLibrary.h" 9 10 #define PLAYING_STATE_DEFAULT_VALUE 99 11 12 class CBassCore : 13 public IPlayerCore 14 { 15 public: 16 CBassCore(); 17 ~CBassCore(); 18 19 virtual void InitCore() override; 20 virtual void UnInitCore() override; 21 unsigned int GetHandle(); 22 23 virtual std::wstring GetAudioType() override; 24 virtual int GetChannels() override; 25 virtual int GetFReq() override; 26 virtual wstring GetSoundFontName() override; 27 28 virtual void Open(const wchar_t* file_path) override; 29 virtual void Close() override; 30 virtual void Play() override; 31 virtual void Pause() override; 32 virtual void Stop() override; 33 virtual void SetVolume(int volume) override; 34 virtual void SetSpeed(float speed) override; 35 virtual void SetPitch(int pitch) override; 36 virtual bool SongIsOver() override; 37 38 virtual int GetCurPosition() override; 39 virtual int GetSongLength() override; 40 virtual void SetCurPosition(int position) override; 41 virtual void GetAudioInfo(SongInfo& song_info, int flag = AF_LENGTH | AF_BITRATE | AF_TAG_INFO) override; 42 virtual void GetAudioInfo(const wchar_t* file_path, SongInfo& song_info, int flag = AF_LENGTH | AF_BITRATE | AF_TAG_INFO) override; 43 44 virtual bool EncodeAudio(SongInfo song_info, const wstring& dest_file_path, EncodeFormat encode_format, void* encode_para, int dest_freq, EncodeAudioProc proc) override; 45 virtual bool InitEncoder() override; 46 virtual void UnInitEncoder() override; 47 virtual bool IsFreqConvertAvailable() override; 48 49 virtual bool IsMidi() override; 50 virtual bool IsMidiConnotPlay() override; 51 virtual std::wstring GetMidiInnerLyric() override; 52 virtual MidiInfo GetMidiInfo() override; 53 virtual bool MidiNoLyric() override; 54 virtual PlayingState GetPlayingState() override; 55 56 struct MidiLyricInfo 57 { 58 wstring midi_lyric; 59 bool midi_no_lyric; 60 }; 61 62 virtual void ApplyEqualizer(int channel, int gain) override; 63 virtual void SetReverb(int mix, int time) override; 64 virtual void ClearReverb() override; 65 virtual void GetFFTData(float fft_data[FFT_SAMPLE]) override; 66 67 virtual int GetErrorCode() override; 68 virtual std::wstring GetErrorInfo(int error_code) override; 69 virtual std::wstring GetErrorInfo() override; 70 GetCoreType()71 virtual PlayerCoreType GetCoreType() override { return PT_BASS; } 72 73 virtual bool IsVolumeFadingOut() override; 74 75 static int GetBASSCurrentPosition(HSTREAM hStream); 76 static Time GetBASSSongLength(HSTREAM hStream); 77 static void SetCurrentPosition(HSTREAM hStream, int position); 78 79 static void GetBASSAudioInfo(HSTREAM hStream, SongInfo & song_info, int flag = AF_LENGTH | AF_BITRATE | AF_TAG_INFO); 80 GetEncoderDir()81 wstring GetEncoderDir() { return m_encode_dir; } 82 83 public: 84 static CBASSMidiLibrary m_bass_midi_lib; 85 static BASS_MIDI_FONT m_sfont; //MIDI音色库 86 87 private: 88 //获取Midi音乐内嵌歌词的回调函数 89 static void CALLBACK MidiLyricSync(HSYNC handle, DWORD channel, DWORD data, void *user); 90 static void CALLBACK MidiEndSync(HSYNC handle, DWORD channel, DWORD data, void *user); 91 92 void GetMidiPosition(); 93 void SetFXHandle(); //设置音效句柄 94 void RemoveFXHandle(); //移除音效句柄 95 96 private: 97 HSTREAM m_musicStream{}; //当前的音频句柄 98 wstring m_file_path; //当前音频文件的路径 99 vector<HPLUGIN> m_plugin_handles; //插件的句柄 100 wstring m_sfont_name; //MIDI音色库的名称 101 static MidiLyricInfo m_midi_lyric; 102 BASS_CHANNELINFO m_channel_info{}; //音频通道的信息 103 bool m_is_midi{}; 104 MidiInfo m_midi_info{}; 105 int m_error_code{}; 106 int m_last_playing_state{ PLAYING_STATE_DEFAULT_VALUE }; //保存上一次的播放状态(BASS_ChannelIsActive的返回值) 107 108 int m_equ_handle[EQU_CH_NUM]{}; //均衡器通道的句柄 109 int m_reverb_handle{}; //混响的句柄 110 const float FREQ_TABLE[EQU_CH_NUM]{ 80, 125, 250, 500, 1000, 1500, 2000, 4000, 8000, 1600 }; //每个均衡器通道的中心频率 111 112 int m_volume{60}; 113 114 enum { FADE_TIMER_ID = 1010 }; 115 116 static CCriticalSection m_critical; 117 PlayingState m_playing_state{}; 118 119 static CBASSEncodeLibrary m_bass_encode_lib; 120 static CBASSWmaLibrary m_bass_wma_lib; 121 static CBassMixLibrary m_bass_mix_lib; 122 123 wstring m_encode_dir; 124 125 static bool m_fading; //音量是否处于淡入淡出状态 126 }; 127