xref: /MusicPlayer2/MusicPlayer2/BassCore.h (revision 8959a120c2c1a8b30f887255062f37449f37dee8)
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