xref: /MusicPlayer2/MusicPlayer2/PlaySettingsDlg.cpp (revision 3cbe69b48d1fd401d1871018becae882cc111dd1)
1 // CPlaySettingsDlg.cpp: 实现文件
2 //
3 
4 #include "stdafx.h"
5 #include "MusicPlayer2.h"
6 #include "Player.h"
7 #include "PlaySettingsDlg.h"
8 #include "FfmpegCore.h"
9 #include "WinVersionHelper.h"
10 #include "FilterHelper.h"
11 
12 
13 // CPlaySettingsDlg 对话框
14 
IMPLEMENT_DYNAMIC(CPlaySettingsDlg,CTabDlg)15 IMPLEMENT_DYNAMIC(CPlaySettingsDlg, CTabDlg)
16 
17 CPlaySettingsDlg::CPlaySettingsDlg(CWnd* pParent /*=nullptr*/)
18     : CTabDlg(IDD_PLAY_SETTING_DIALOG, pParent)
19 {
20 
21 }
22 
~CPlaySettingsDlg()23 CPlaySettingsDlg::~CPlaySettingsDlg()
24 {
25 }
26 
ShowDeviceInfo()27 void CPlaySettingsDlg::ShowDeviceInfo()
28 {
29     if (theApp.m_output_devices.empty())
30         return;
31 
32     // 重新设置设备选择下拉框
33     m_output_device_combo.ResetContent();
34     for (const auto& device : theApp.m_output_devices)
35     {
36         m_output_device_combo.AddString(device.name.c_str());
37     }
38     m_output_device_combo.SetCurSel(m_data.device_selected);
39 
40     // 更新当前设备信息显示
41     DeviceInfo& device{ theApp.m_output_devices[m_data.device_selected] };
42     m_device_info_list.SetItemText(0, 1, device.name.c_str());
43     m_device_info_list.SetItemText(1, 1, device.driver.c_str());
44     m_data.output_device = device.name;
45     DWORD device_type;
46     device_type = device.flags & BASS_DEVICE_TYPE_MASK;
47     wstring type_info;
48     switch (device_type)
49     {
50     case BASS_DEVICE_TYPE_NETWORK: type_info = theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_DEVICE_TYPE_NETWORK"); break;
51     case BASS_DEVICE_TYPE_SPEAKERS: type_info = theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_DEVICE_TYPE_SPEAKERS"); break;
52     case BASS_DEVICE_TYPE_LINE: type_info = theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_DEVICE_TYPE_LINE"); break;
53     case BASS_DEVICE_TYPE_HEADPHONES: type_info = theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_DEVICE_TYPE_HEADPHONES"); break;
54     case BASS_DEVICE_TYPE_MICROPHONE: type_info = theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_DEVICE_TYPE_MICROPHONE"); break;
55     case BASS_DEVICE_TYPE_HEADSET: type_info = theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_DEVICE_TYPE_HEADSET"); break;
56     case BASS_DEVICE_TYPE_HANDSET: type_info = theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_DEVICE_TYPE_HANDSET"); break;
57     case BASS_DEVICE_TYPE_DIGITAL: type_info = theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_DEVICE_TYPE_DIGITAL"); break;
58     case BASS_DEVICE_TYPE_SPDIF: type_info = theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_DEVICE_TYPE_SPDIF"); break;
59     case BASS_DEVICE_TYPE_HDMI: type_info = theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_DEVICE_TYPE_HDMI"); break;
60     case BASS_DEVICE_TYPE_DISPLAYPORT: type_info = theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_DEVICE_TYPE_DISPLAYPORT"); break;
61     default: break;
62     }
63     m_device_info_list.SetItemText(2, 1, type_info.c_str());
64 }
65 
EnableControl()66 void CPlaySettingsDlg::EnableControl()
67 {
68     bool enable = !CPlayer::GetInstance().IsMciCore();
69     bool ffmpeg_enable = CPlayer::GetInstance().IsFfmpegCore();
70     EnableDlgCtrl(IDC_SOUND_FADE_CHECK, CPlayer::GetInstance().IsBassCore());
71     m_device_info_list.EnableWindow(enable);
72     m_output_device_combo.EnableWindow(enable);
73     m_ffmpeg_cache_length.EnableWindow(ffmpeg_enable);
74     m_ffmpeg_max_retry_count.EnableWindow(ffmpeg_enable);
75     m_ffmpeg_url_retry_interval.EnableWindow(ffmpeg_enable);
76     bool max_wait_time_support{ false }, wasapi_support{ false };
77     if (ffmpeg_enable) {
78         auto core = static_cast<CFfmpegCore*>(CPlayer::GetInstance().GetPlayerCore());
79         wasapi_support = core->IsWASAPISupported();
80         auto version = core->GetVersion();
81         max_wait_time_support = version > FFMPEG_CORE_VERSION(1, 0, 0, 0);
82     }
83     m_ffmpeg_max_wait_time.EnableWindow(max_wait_time_support);
84     EnableDlgCtrl(IDC_FFMPEG_ENABLE_WASAPI, wasapi_support);
85     EnableDlgCtrl(IDC_FFMPEG_ENABLE_WASAPI_EXCLUSIVE, wasapi_support && m_data.ffmpeg_core_enable_WASAPI);
86 
87     bool midi_enable = !theApp.m_play_setting_data.use_ffmpeg && !theApp.m_play_setting_data.use_mci;
88     m_sf2_path_edit.EnableWindow(midi_enable && theApp.m_format_convert_dialog_exit);		//正在进行格式转换时不允许更改音色库
89     EnableDlgCtrl(IDC_MIDI_USE_INNER_LYRIC_CHECK, midi_enable);
90 }
91 
GetDataFromUi()92 void CPlaySettingsDlg::GetDataFromUi()
93 {
94     m_data.stop_when_error = (IsDlgButtonChecked(IDC_STOP_WHEN_ERROR) != FALSE);
95     m_data.auto_play_when_start = (IsDlgButtonChecked(IDC_AUTO_PLAY_WHEN_START_CHECK) != FALSE);
96     m_data.show_taskbar_progress = (IsDlgButtonChecked(IDC_SHOW_TASKBAR_PROGRESS) != FALSE);
97     m_data.show_playstate_icon = (IsDlgButtonChecked(IDC_SHOW_PLAY_STATE_ICON_CHECK) != FALSE);
98     m_data.fade_effect = (IsDlgButtonChecked(IDC_SOUND_FADE_CHECK) != FALSE);
99     m_data.continue_when_switch_playlist = (IsDlgButtonChecked(IDC_CONTINUE_WHEN_SWITCH_PLAYLIST_CHECK) != FALSE);
100     m_data.use_media_trans_control = (IsDlgButtonChecked(IDC_USE_MEDIA_TRANS_CONTORL_CHECK) != FALSE);
101 
102     m_data.use_mci = (IsDlgButtonChecked(IDC_MCI_RADIO) != FALSE);
103     m_data.use_ffmpeg = (IsDlgButtonChecked(IDC_FFMPEG_RADIO) != FALSE);
104 
105     m_data.ffmpeg_core_cache_length = m_ffmpeg_cache_length.GetValue();
106     m_data.ffmpeg_core_max_retry_count = m_ffmpeg_max_retry_count.GetValue();
107     m_data.ffmpeg_core_url_retry_interval = m_ffmpeg_url_retry_interval.GetValue();
108     m_data.ffmpeg_core_max_wait_time = m_ffmpeg_max_wait_time.GetValue();
109     m_data.ffmpeg_core_enable_WASAPI = (IsDlgButtonChecked(IDC_FFMPEG_ENABLE_WASAPI) != FALSE);
110     m_data.ffmpeg_core_enable_WASAPI_exclusive_mode = (IsDlgButtonChecked(IDC_FFMPEG_ENABLE_WASAPI_EXCLUSIVE) != FALSE);
111 }
112 
ApplyDataToUi()113 void CPlaySettingsDlg::ApplyDataToUi()
114 {
115     ShowDeviceInfo();
116     EnableControl();
117 }
118 
InitializeControls()119 bool CPlaySettingsDlg::InitializeControls()
120 {
121     wstring temp;
122     temp = theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_PLAY_OPT");
123     SetDlgItemTextW(IDC_TXT_OPT_PLAY_PLAY_OPT_STATIC, temp.c_str());
124     temp = theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_STOP_WHEN_ERROR");
125     SetDlgItemTextW(IDC_STOP_WHEN_ERROR, temp.c_str());
126     temp = theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_AUTO_PLAY_WHEN_START");
127     SetDlgItemTextW(IDC_AUTO_PLAY_WHEN_START_CHECK, temp.c_str());
128     temp = theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_SHOW_TASKBAR_PROGRESS");
129     SetDlgItemTextW(IDC_SHOW_TASKBAR_PROGRESS, temp.c_str());
130     temp = theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_SHOW_TASKBAR_PLAY_STATE_ICON");
131     SetDlgItemTextW(IDC_SHOW_PLAY_STATE_ICON_CHECK, temp.c_str());
132     temp = theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_SOUND_FADE");
133     SetDlgItemTextW(IDC_SOUND_FADE_CHECK, temp.c_str());
134     temp = theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_CONTINUE_WHEN_SWITCH_PLAYLIST");
135     SetDlgItemTextW(IDC_CONTINUE_WHEN_SWITCH_PLAYLIST_CHECK, temp.c_str());
136     temp = theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_USE_MEDIA_TRANS_CONTROL");
137     SetDlgItemTextW(IDC_USE_MEDIA_TRANS_CONTORL_CHECK, temp.c_str());
138     temp = theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_CORE");
139     SetDlgItemTextW(IDC_TXT_OPT_PLAY_CORE_STATIC, temp.c_str());
140     temp = theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_CORE_BASS");
141     SetDlgItemTextW(IDC_BASS_RADIO, temp.c_str());
142     temp = theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_CORE_MCI");
143     SetDlgItemTextW(IDC_MCI_RADIO, temp.c_str());
144     temp = theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_CORE_FFMPEG");
145     SetDlgItemTextW(IDC_FFMPEG_RADIO, temp.c_str());
146     temp = L"<a>" + theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_CORE_FFMPEG_DL_INFO") + L"</a>";
147     SetDlgItemTextW(IDC_FFMPEG_DOWN_SYSLINK, temp.c_str());
148     temp = theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_DEVICE");
149     SetDlgItemTextW(IDC_TXT_OPT_PLAY_DEVICE_STATIC, temp.c_str());
150     temp = theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_DEVICE_SEL");
151     SetDlgItemTextW(IDC_TXT_OPT_PLAY_DEVICE_SEL_STATIC, temp.c_str());
152     // IDC_OUTPUT_DEVICE_COMBO
153     // IDC_OUTPUT_DEVICE_INFO_LIST
154     temp = theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_FFMPEG_CORE_SETTING");
155     SetDlgItemTextW(IDC_TXT_OPT_PLAY_FFMPEG_CORE_SETTING_STATIC, temp.c_str());
156     temp = theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_FFMPEG_CORE_CACHE_LENGTH");
157     SetDlgItemTextW(IDC_TXT_OPT_PLAY_FFMPEG_CORE_CACHE_LENGTH_STATIC, temp.c_str());
158     // IDC_FFMPEG_CACHE_LENGTH
159     temp = theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_FFMPEG_CORE_MAX_RETRY_COUNT");
160     SetDlgItemTextW(IDC_TXT_OPT_PLAY_FFMPEG_CORE_MAX_RETRY_COUNT_STATIC, temp.c_str());
161     // IDC_FFMPEG_MAX_RETRY_COUNT
162     temp = theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_FFMPEG_CORE_URL_RETRY_INTERVAL");
163     SetDlgItemTextW(IDC_TXT_OPT_PLAY_FFMPEG_CORE_URL_RETRY_INTERVAL_STATIC, temp.c_str());
164     // IDC_FFMPEG_URL_RETRY_INTERVAL
165     temp = theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_FFMPEG_CORE_MAX_WAIT_TIME");
166     SetDlgItemTextW(IDC_TXT_OPT_PLAY_FFMPEG_CORE_MAX_WAIT_TIME_STATIC, temp.c_str());
167     // IDC_FFMPEG_MAX_WAIT_TIME
168     temp = theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_FFMPEG_CORE_ENABLE_WASAPI");
169     SetDlgItemTextW(IDC_FFMPEG_ENABLE_WASAPI, temp.c_str());
170     temp = theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_FFMPEG_CORE_ENABLE_WASAPI_EXCLUSIVE");
171     SetDlgItemTextW(IDC_FFMPEG_ENABLE_WASAPI_EXCLUSIVE, temp.c_str());
172 
173     temp = theApp.m_str_table.LoadText(L"TXT_OPT_DATA_MIDI_SETTING");
174     SetDlgItemTextW(IDC_TXT_OPT_DATA_MIDI_SETTING_STATIC, temp.c_str());
175     temp = theApp.m_str_table.LoadText(L"TXT_OPT_DATA_MIDI_INNER_LYRIC_FIRST");
176     SetDlgItemTextW(IDC_MIDI_USE_INNER_LYRIC_CHECK, temp.c_str());
177     temp = theApp.m_str_table.LoadText(L"TXT_OPT_DATA_MIDI_SF2_PATH");
178     SetDlgItemTextW(IDC_TXT_OPT_DATA_MIDI_SF2_PATH_STATIC, temp.c_str());
179     // IDC_SF2_PATH_EDIT
180 
181     RepositionTextBasedControls({
182         { CtrlTextInfo::L1, IDC_FFMPEG_RADIO, CtrlTextInfo::W16 },
183         { CtrlTextInfo::C0, IDC_FFMPEG_DOWN_SYSLINK }
184         });
185     RepositionTextBasedControls({
186         { CtrlTextInfo::L1, IDC_TXT_OPT_PLAY_DEVICE_SEL_STATIC },
187         { CtrlTextInfo::C0, IDC_OUTPUT_DEVICE_COMBO }
188         });
189     RepositionTextBasedControls({
190         { CtrlTextInfo::L1, IDC_TXT_OPT_DATA_MIDI_SF2_PATH_STATIC },
191         { CtrlTextInfo::C0, IDC_SF2_PATH_EDIT }
192         });
193 
194     return true;
195 }
196 
DoDataExchange(CDataExchange * pDX)197 void CPlaySettingsDlg::DoDataExchange(CDataExchange* pDX)
198 {
199     CTabDlg::DoDataExchange(pDX);
200     DDX_Control(pDX, IDC_OUTPUT_DEVICE_COMBO, m_output_device_combo);
201     DDX_Control(pDX, IDC_OUTPUT_DEVICE_INFO_LIST, m_device_info_list);
202     DDX_Control(pDX, IDC_FFMPEG_CACHE_LENGTH, m_ffmpeg_cache_length);
203     DDX_Control(pDX, IDC_FFMPEG_MAX_RETRY_COUNT, m_ffmpeg_max_retry_count);
204     DDX_Control(pDX, IDC_FFMPEG_URL_RETRY_INTERVAL, m_ffmpeg_url_retry_interval);
205     DDX_Control(pDX, IDC_FFMPEG_MAX_WAIT_TIME, m_ffmpeg_max_wait_time);
206     DDX_Control(pDX, IDC_SF2_PATH_EDIT, m_sf2_path_edit);
207 }
208 
209 
BEGIN_MESSAGE_MAP(CPlaySettingsDlg,CTabDlg)210 BEGIN_MESSAGE_MAP(CPlaySettingsDlg, CTabDlg)
211     ON_CBN_SELCHANGE(IDC_OUTPUT_DEVICE_COMBO, &CPlaySettingsDlg::OnCbnSelchangeOutputDeviceCombo)
212     ON_NOTIFY(NM_CLICK, IDC_FFMPEG_DOWN_SYSLINK, &CPlaySettingsDlg::OnNMClickFfmpegDownSyslink)
213     ON_BN_CLICKED(IDC_FFMPEG_ENABLE_WASAPI, &CPlaySettingsDlg::OnBnClickedFfmpegEnableWasapi)
214     ON_BN_CLICKED(IDC_MIDI_USE_INNER_LYRIC_CHECK, &CPlaySettingsDlg::OnBnClickedMidiUseInnerLyricCheck)
215     ON_EN_CHANGE(IDC_SF2_PATH_EDIT, &CPlaySettingsDlg::OnEnChangeSf2PathEdit)
216     ON_MESSAGE(WM_EDIT_BROWSE_CHANGED, &CPlaySettingsDlg::OnEditBrowseChanged)
217 END_MESSAGE_MAP()
218 
219 
220 // CPlaySettingsDlg 消息处理程序
221 
222 
223 BOOL CPlaySettingsDlg::OnInitDialog()
224 {
225     CTabDlg::OnInitDialog();
226 
227     // TODO:  在此添加额外的初始化
228 
229     m_toolTip.Create(this);
230     m_toolTip.SetMaxTipWidth(theApp.DPI(300));
231     m_toolTip.AddTool(GetDlgItem(IDC_MCI_RADIO), theApp.m_str_table.LoadText(L"TIP_OPT_PLAY_CORE_MCI").c_str());
232     m_toolTip.AddTool(GetDlgItem(IDC_FFMPEG_RADIO), theApp.m_str_table.LoadText(L"TIP_OPT_PLAY_CORE_FFMPEG").c_str());
233     m_toolTip.AddTool(GetDlgItem(IDC_CONTINUE_WHEN_SWITCH_PLAYLIST_CHECK), theApp.m_str_table.LoadText(L"TIP_OPT_PLAY_CONTINUE_WHEN_SWITCH_PLAYLIST").c_str());
234     m_toolTip.AddTool(GetDlgItem(IDC_MIDI_USE_INNER_LYRIC_CHECK), theApp.m_str_table.LoadText(L"TIP_OPT_DATA_MIDI_INNER_LYRIC_FIRST").c_str());
235     m_toolTip.SetWindowPos(&CWnd::wndTopMost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
236 
237     //初始化各控件的状态
238     if (!CWinVersionHelper::IsWindows7OrLater() || theApp.GetITaskbarList3() == nullptr)
239     {
240         m_data.show_taskbar_progress = false;
241         m_data.show_playstate_icon = false;
242         EnableDlgCtrl(IDC_SHOW_TASKBAR_PROGRESS, false);
243         EnableDlgCtrl(IDC_SHOW_PLAY_STATE_ICON_CHECK, false);
244     }
245     if (!CWinVersionHelper::IsWindows81OrLater())
246     {
247         m_data.use_media_trans_control = false;
248         EnableDlgCtrl(IDC_USE_MEDIA_TRANS_CONTORL_CHECK, FALSE);
249     }
250     CheckDlgButton(IDC_STOP_WHEN_ERROR, m_data.stop_when_error);
251     CheckDlgButton(IDC_AUTO_PLAY_WHEN_START_CHECK, m_data.auto_play_when_start);
252     CheckDlgButton(IDC_SHOW_TASKBAR_PROGRESS, m_data.show_taskbar_progress);
253     CheckDlgButton(IDC_SHOW_PLAY_STATE_ICON_CHECK, m_data.show_playstate_icon);
254     CheckDlgButton(IDC_SOUND_FADE_CHECK, m_data.fade_effect);
255     CheckDlgButton(IDC_CONTINUE_WHEN_SWITCH_PLAYLIST_CHECK, m_data.continue_when_switch_playlist);
256     CheckDlgButton(IDC_USE_MEDIA_TRANS_CONTORL_CHECK, m_data.use_media_trans_control);
257 
258     bool enable_ffmpeg = false;
259     if (CPlayer::GetInstance().IsFfmpegCore()) {
260         enable_ffmpeg = true;
261     } else {
262         auto h = LoadLibraryW(L"ffmpeg_core.dll");
263         if (h) {
264             enable_ffmpeg = true;
265             FreeLibrary(h);
266         }
267     }
268     EnableDlgCtrl(IDC_FFMPEG_RADIO, enable_ffmpeg);
269     ShowDlgCtrl(IDC_FFMPEG_DOWN_SYSLINK, !enable_ffmpeg);       //未检测到ffmpeg内核时,显示下载链接
270     m_data.use_ffmpeg &= enable_ffmpeg;
271 
272     if (m_data.use_ffmpeg)
273         CheckDlgButton(IDC_FFMPEG_RADIO, TRUE);
274     else if (m_data.use_mci)
275         CheckDlgButton(IDC_MCI_RADIO, TRUE);
276     else
277         CheckDlgButton(IDC_BASS_RADIO, TRUE);
278 
279     //m_device_info_list.SetColor(theApp.m_app_setting_data.theme_color);
280     m_device_info_list.SetMouseWheelEnable(false);
281     CRect rect;
282     m_device_info_list.GetClientRect(rect);
283     int width0, width1;
284     width0 = theApp.DPI(70);
285     width1 = rect.Width() - width0 - theApp.DPI(20);
286 
287     m_device_info_list.SetExtendedStyle(m_device_info_list.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_LABELTIP);
288     m_device_info_list.InsertColumn(0, theApp.m_str_table.LoadText(L"TXT_ITEM").c_str(), LVCFMT_LEFT, width0);
289     m_device_info_list.InsertColumn(1, theApp.m_str_table.LoadText(L"TXT_VALUE").c_str(), LVCFMT_LEFT, width1);
290     m_device_info_list.InsertItem(0, theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_DEVICE_NAME").c_str());
291     m_device_info_list.InsertItem(1, theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_DEVICE_DRIVER").c_str());
292     m_device_info_list.InsertItem(2, theApp.m_str_table.LoadText(L"TXT_OPT_PLAY_DEVICE_TYPE").c_str());
293     ShowDeviceInfo();
294 
295     EnableControl();
296 
297     m_ffmpeg_cache_length.SetRange(1, 60, 5);
298     m_ffmpeg_cache_length.SetValue(theApp.m_play_setting_data.ffmpeg_core_cache_length);
299     m_ffmpeg_max_retry_count.SetRange(-1, 30);
300     m_ffmpeg_max_retry_count.SetValue(theApp.m_play_setting_data.ffmpeg_core_max_retry_count);
301     m_ffmpeg_url_retry_interval.SetRange(1, 120, 5);
302     m_ffmpeg_url_retry_interval.SetValue(theApp.m_play_setting_data.ffmpeg_core_url_retry_interval);
303     CheckDlgButton(IDC_FFMPEG_ENABLE_WASAPI, theApp.m_play_setting_data.ffmpeg_core_enable_WASAPI);
304     CheckDlgButton(IDC_FFMPEG_ENABLE_WASAPI_EXCLUSIVE, theApp.m_play_setting_data.ffmpeg_core_enable_WASAPI_exclusive_mode);
305     m_ffmpeg_max_wait_time.SetRange(100, 30000, 100);
306     m_ffmpeg_max_wait_time.SetValue(theApp.m_play_setting_data.ffmpeg_core_max_wait_time);
307 
308     m_sf2_path_edit.SetWindowText(m_data.sf2_path.c_str());
309     wstring sf2_filter = FilterHelper::GetSF2FileFilter();
310     m_sf2_path_edit.EnableFileBrowseButton(L"SF2", sf2_filter.c_str());
311     CheckDlgButton(IDC_MIDI_USE_INNER_LYRIC_CHECK, m_data.midi_use_inner_lyric);
312 
313     //设置控件不响应鼠标滚轮消息
314     m_output_device_combo.SetMouseWheelEnable(false);
315     m_ffmpeg_cache_length.SetMouseWheelEnable(false);
316     m_ffmpeg_max_retry_count.SetMouseWheelEnable(false);
317     m_ffmpeg_url_retry_interval.SetMouseWheelEnable(false);
318     m_ffmpeg_max_wait_time.SetMouseWheelEnable(false);
319 
320     return TRUE;  // return TRUE unless you set the focus to a control
321                   // 异常: OCX 属性页应返回 FALSE
322 }
323 
324 
OnCbnSelchangeOutputDeviceCombo()325 void CPlaySettingsDlg::OnCbnSelchangeOutputDeviceCombo()
326 {
327     // TODO: 在此添加控件通知处理程序代码
328     m_data.device_selected = m_output_device_combo.GetCurSel();
329     ShowDeviceInfo();
330 }
331 
332 
PreTranslateMessage(MSG * pMsg)333 BOOL CPlaySettingsDlg::PreTranslateMessage(MSG* pMsg)
334 {
335     // TODO: 在此添加专用代码和/或调用基类
336     if (pMsg->message == WM_MOUSEMOVE)
337         m_toolTip.RelayEvent(pMsg);
338 
339     return CTabDlg::PreTranslateMessage(pMsg);
340 }
341 
342 
OnNMClickFfmpegDownSyslink(NMHDR * pNMHDR,LRESULT * pResult)343 void CPlaySettingsDlg::OnNMClickFfmpegDownSyslink(NMHDR* pNMHDR, LRESULT* pResult)
344 {
345     // TODO: 在此添加控件通知处理程序代码
346     const wstring& info = theApp.m_str_table.LoadText(L"MSG_OPT_PLAY_CORE_FFMPEG_DL_INFO");
347     if (MessageBox(info.c_str(), NULL, MB_ICONINFORMATION | MB_YESNO) == IDYES)
348     {
349         ShellExecute(NULL, _T("open"), _T("https://github.com/lifegpc/ffmpeg_core/releases"), NULL, NULL, SW_SHOW);
350     }
351 
352     *pResult = 0;
353 }
354 
355 
OnBnClickedFfmpegEnableWasapi()356 void CPlaySettingsDlg::OnBnClickedFfmpegEnableWasapi() {
357     m_data.ffmpeg_core_enable_WASAPI = (IsDlgButtonChecked(IDC_FFMPEG_ENABLE_WASAPI) != FALSE);
358     EnableDlgCtrl(IDC_FFMPEG_ENABLE_WASAPI_EXCLUSIVE, m_data.ffmpeg_core_enable_WASAPI);
359 }
360 
OnBnClickedMidiUseInnerLyricCheck()361 void CPlaySettingsDlg::OnBnClickedMidiUseInnerLyricCheck()
362 {
363     // TODO: 在此添加控件通知处理程序代码
364     m_data.midi_use_inner_lyric = (((CButton*)GetDlgItem(IDC_MIDI_USE_INNER_LYRIC_CHECK))->GetCheck() != 0);
365 }
366 
OnEnChangeSf2PathEdit()367 void CPlaySettingsDlg::OnEnChangeSf2PathEdit()
368 {
369     // TODO:  如果该控件是 RICHEDIT 控件,它将不
370     // 发送此通知,除非重写 CTabDlg::OnInitDialog()
371     // 函数并调用 CRichEditCtrl().SetEventMask(),
372     // 同时将 ENM_CHANGE 标志“或”运算到掩码中。
373     if (m_sf2_path_edit.GetModify())
374     {
375         CString str;
376         m_sf2_path_edit.GetWindowText(str);
377         m_data.sf2_path = str;
378     }
379 
380     // TODO:  在此添加控件通知处理程序代码
381 }
382 
OnEditBrowseChanged(WPARAM wParam,LPARAM lParam)383 LRESULT CPlaySettingsDlg::OnEditBrowseChanged(WPARAM wParam, LPARAM lParam)
384 {
385     CString str;
386     m_sf2_path_edit.GetWindowText(str);
387     m_data.sf2_path = str;
388     return 0;
389 }
390