config.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:12k
源码类别:

Windows CE

开发平台:

C/C++

  1. /* in_flac - Winamp2 FLAC input plugin
  2.  * Copyright (C) 2002,2003,2004,2005  Josh Coalson
  3.  *
  4.  * This program is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU General Public License
  6.  * as published by the Free Software Foundation; either version 2
  7.  * of the License, or (at your option) any later version.
  8.  *
  9.  * This program is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  * GNU General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  17.  */
  18. #include <windows.h>
  19. #include <commctrl.h>
  20. #include <stdio.h>
  21. #include "config.h"
  22. #include "tagz.h"
  23. #include "resource.h"
  24. static char buffer[256];
  25. static char ini_name[MAX_PATH];
  26. /*
  27.  *  Read/write config
  28.  */
  29. #define RI(x, def)          (x = GetPrivateProfileInt("FLAC", #x, def, ini_name))
  30. #define WI(x)               WritePrivateProfileString("FLAC", #x, itoa(x, buffer, 10), ini_name)
  31. #define RS(x, n, def)       GetPrivateProfileString("FLAC", #x, def, x, n, ini_name)
  32. #define WS(x)               WritePrivateProfileString("FLAC", #x, x, ini_name)
  33. static const char default_format[] = "[%artist% - ]$if2(%title%,%filename%)";
  34. static const char default_sep[] = ", ";
  35. static wchar_t *convert_ansi_to_wide_(const char *src)
  36. {
  37. int len;
  38. wchar_t *dest;
  39. FLAC__ASSERT(0 != src);
  40. len = strlen(src) + 1;
  41. /* copy */
  42. dest = malloc(len*sizeof(wchar_t));
  43. if (dest) mbstowcs(dest, src, len);
  44. return dest;
  45. }
  46. void InitConfig()
  47. {
  48. char *p;
  49. GetModuleFileName(NULL, ini_name, sizeof(ini_name));
  50. p = strrchr(ini_name, '.');
  51. if (!p) p = ini_name + strlen(ini_name);
  52. strcpy(p, ".ini");
  53. flac_cfg.title.tag_format_w = NULL;
  54. }
  55. void ReadConfig()
  56. {
  57. RS(flac_cfg.title.tag_format, sizeof(flac_cfg.title.tag_format), default_format);
  58. if (flac_cfg.title.tag_format_w)
  59. free(flac_cfg.title.tag_format_w);
  60. flac_cfg.title.tag_format_w = convert_ansi_to_wide_(flac_cfg.title.tag_format);
  61. /* @@@ FIXME: trailing spaces */
  62. RS(flac_cfg.title.sep, sizeof(flac_cfg.title.sep), default_sep);
  63. RI(flac_cfg.tag.reserve_space, 1);
  64. RI(flac_cfg.display.show_bps, 1);
  65. RI(flac_cfg.output.misc.stop_err, 0);
  66. RI(flac_cfg.output.replaygain.enable, 1);
  67. RI(flac_cfg.output.replaygain.album_mode, 0);
  68. RI(flac_cfg.output.replaygain.hard_limit, 0);
  69. RI(flac_cfg.output.replaygain.preamp, 0);
  70. RI(flac_cfg.output.resolution.normal.dither_24_to_16, 0);
  71. RI(flac_cfg.output.resolution.replaygain.dither, 0);
  72. RI(flac_cfg.output.resolution.replaygain.noise_shaping, 1);
  73. RI(flac_cfg.output.resolution.replaygain.bps_out, 16);
  74. }
  75. void WriteConfig()
  76. {
  77. WS(flac_cfg.title.tag_format);
  78. WI(flac_cfg.tag.reserve_space);
  79. WS(flac_cfg.title.sep);
  80. WI(flac_cfg.display.show_bps);
  81. WI(flac_cfg.output.misc.stop_err);
  82. WI(flac_cfg.output.replaygain.enable);
  83. WI(flac_cfg.output.replaygain.album_mode);
  84. WI(flac_cfg.output.replaygain.hard_limit);
  85. WI(flac_cfg.output.replaygain.preamp);
  86. WI(flac_cfg.output.resolution.normal.dither_24_to_16);
  87. WI(flac_cfg.output.resolution.replaygain.dither);
  88. WI(flac_cfg.output.resolution.replaygain.noise_shaping);
  89. WI(flac_cfg.output.resolution.replaygain.bps_out);
  90. }
  91. /*
  92.  *  Dialog
  93.  */
  94. #define PREAMP_RANGE            24
  95. #define Check(x,y)              CheckDlgButton(hwnd, x, y ? BST_CHECKED : BST_UNCHECKED)
  96. #define GetCheck(x)             (IsDlgButtonChecked(hwnd, x)==BST_CHECKED)
  97. #define GetSel(x)               SendDlgItemMessage(hwnd, x, CB_GETCURSEL, 0, 0)
  98. #define GetPos(x)               SendDlgItemMessage(hwnd, x, TBM_GETPOS, 0, 0)
  99. #define Enable(x,y)             EnableWindow(GetDlgItem(hwnd, x), y)
  100. static INT_PTR CALLBACK GeneralProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  101. {
  102. switch (msg)
  103. {
  104. /* init */
  105. case WM_INITDIALOG:
  106. SendDlgItemMessage(hwnd, IDC_TITLE, EM_LIMITTEXT, 255, 0);
  107. SendDlgItemMessage(hwnd, IDC_SEP, EM_LIMITTEXT, 15, 0);
  108. SetDlgItemText(hwnd, IDC_TITLE, flac_cfg.title.tag_format);
  109. SetDlgItemText(hwnd, IDC_SEP, flac_cfg.title.sep);
  110. Check(IDC_ID3V1, 0);
  111. /*! Check(IDC_RESERVE, flac_cfg.tag.reserve_space); */
  112. Check(IDC_BPS, flac_cfg.display.show_bps);
  113. Check(IDC_ERRORS, flac_cfg.output.misc.stop_err);
  114. return TRUE;
  115. /* commands */
  116. case WM_COMMAND:
  117. switch (LOWORD(wParam))
  118. {
  119. /* ok */
  120. case IDOK:
  121. GetDlgItemText(hwnd, IDC_TITLE, flac_cfg.title.tag_format, sizeof(flac_cfg.title.tag_format));
  122. if (flac_cfg.title.tag_format_w)
  123. free(flac_cfg.title.tag_format_w);
  124. GetDlgItemText(hwnd, IDC_SEP, flac_cfg.title.sep, sizeof(flac_cfg.title.sep));
  125. flac_cfg.title.tag_format_w = convert_ansi_to_wide_(flac_cfg.title.tag_format);
  126. /*! flac_cfg.tag.reserve_space = GetCheck(IDC_RESERVE); */
  127. flac_cfg.display.show_bps = GetCheck(IDC_BPS);
  128. flac_cfg.output.misc.stop_err = GetCheck(IDC_ERRORS);
  129. break;
  130. /* reset */
  131. case IDC_RESET:
  132. Check(IDC_ID3V1, 0);
  133. Check(IDC_RESERVE, 1);
  134. Check(IDC_BPS, 1);
  135. Check(IDC_ERRORS, 0);
  136. /* fall throught */
  137. /* default */
  138. case IDC_TAGZ_DEFAULT:
  139. SetDlgItemText(hwnd, IDC_TITLE, default_format);
  140. break;
  141. /* help */
  142. case IDC_TAGZ_HELP:
  143. MessageBox(hwnd, tagz_manual, "Help", 0);
  144. break;
  145. }
  146. break;
  147. }
  148. return 0;
  149. }
  150. static void UpdatePreamp(HWND hwnd, HWND hamp)
  151. {
  152. int pos = SendMessage(hamp, TBM_GETPOS, 0, 0) - PREAMP_RANGE;
  153. sprintf(buffer, "%d dB", pos);
  154. SetDlgItemText(hwnd, IDC_PA, buffer);
  155. }
  156. static void UpdateRG(HWND hwnd)
  157. {
  158. int on = GetCheck(IDC_ENABLE);
  159. Enable(IDC_ALBUM, on);
  160. Enable(IDC_LIMITER, on);
  161. Enable(IDC_PREAMP, on);
  162. Enable(IDC_PA, on);
  163. }
  164. static void UpdateDither(HWND hwnd)
  165. {
  166. int on = GetCheck(IDC_DITHERRG);
  167. Enable(IDC_SHAPE, on);
  168. }
  169. static INT_PTR CALLBACK OutputProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  170. {
  171. switch (msg)
  172. {
  173. /* init */
  174. case WM_INITDIALOG:
  175. Check(IDC_ENABLE, flac_cfg.output.replaygain.enable);
  176. Check(IDC_ALBUM, flac_cfg.output.replaygain.album_mode);
  177. Check(IDC_LIMITER, flac_cfg.output.replaygain.hard_limit);
  178. Check(IDC_DITHER, flac_cfg.output.resolution.normal.dither_24_to_16);
  179. Check(IDC_DITHERRG, flac_cfg.output.resolution.replaygain.dither);
  180. /* prepare preamp slider */
  181. {
  182. HWND hamp = GetDlgItem(hwnd, IDC_PREAMP);
  183. SendMessage(hamp, TBM_SETRANGE, 1, MAKELONG(0, PREAMP_RANGE*2));
  184. SendMessage(hamp, TBM_SETPOS, 1, flac_cfg.output.replaygain.preamp+PREAMP_RANGE);
  185. UpdatePreamp(hwnd, hamp);
  186. }
  187. /* fill comboboxes */
  188. {
  189. HWND hlist = GetDlgItem(hwnd, IDC_TO);
  190. SendMessage(hlist, CB_ADDSTRING, 0, (LPARAM)"16 bps");
  191. SendMessage(hlist, CB_ADDSTRING, 0, (LPARAM)"24 bps");
  192. SendMessage(hlist, CB_SETCURSEL, flac_cfg.output.resolution.replaygain.bps_out/8 - 2, 0);
  193. hlist = GetDlgItem(hwnd, IDC_SHAPE);
  194. SendMessage(hlist, CB_ADDSTRING, 0, (LPARAM)"None");
  195. SendMessage(hlist, CB_ADDSTRING, 0, (LPARAM)"Low");
  196. SendMessage(hlist, CB_ADDSTRING, 0, (LPARAM)"Medium");
  197. SendMessage(hlist, CB_ADDSTRING, 0, (LPARAM)"High");
  198. SendMessage(hlist, CB_SETCURSEL, flac_cfg.output.resolution.replaygain.noise_shaping, 0);
  199. }
  200. UpdateRG(hwnd);
  201. UpdateDither(hwnd);
  202. return TRUE;
  203. /* commands */
  204. case WM_COMMAND:
  205. switch (LOWORD(wParam))
  206. {
  207. /* ok */
  208. case IDOK:
  209. flac_cfg.output.replaygain.enable = GetCheck(IDC_ENABLE);
  210. flac_cfg.output.replaygain.album_mode = GetCheck(IDC_ALBUM);
  211. flac_cfg.output.replaygain.hard_limit = GetCheck(IDC_LIMITER);
  212. flac_cfg.output.replaygain.preamp = GetPos(IDC_PREAMP) - PREAMP_RANGE;
  213. flac_cfg.output.resolution.normal.dither_24_to_16 = GetCheck(IDC_DITHER);
  214. flac_cfg.output.resolution.replaygain.dither = GetCheck(IDC_DITHERRG);
  215. flac_cfg.output.resolution.replaygain.noise_shaping = GetSel(IDC_SHAPE);
  216. flac_cfg.output.resolution.replaygain.bps_out = (GetSel(IDC_TO)+2)*8;
  217. break;
  218. /* reset */
  219. case IDC_RESET:
  220. Check(IDC_ENABLE, 1);
  221. Check(IDC_ALBUM, 0);
  222. Check(IDC_LIMITER, 0);
  223. Check(IDC_DITHER, 0);
  224. Check(IDC_DITHERRG, 0);
  225. SendDlgItemMessage(hwnd, IDC_PREAMP, TBM_SETPOS, 1, PREAMP_RANGE);
  226. SendDlgItemMessage(hwnd, IDC_TO, CB_SETCURSEL, 0, 0);
  227. SendDlgItemMessage(hwnd, IDC_SHAPE, CB_SETCURSEL, 1, 0);
  228. UpdatePreamp(hwnd, GetDlgItem(hwnd, IDC_PREAMP));
  229. UpdateRG(hwnd);
  230. UpdateDither(hwnd);
  231. break;
  232. /* active check-boxes */
  233. case IDC_ENABLE:
  234. UpdateRG(hwnd);
  235. break;
  236. case IDC_DITHERRG:
  237. UpdateDither(hwnd);
  238. break;
  239. }
  240. break;
  241. /* scroller */
  242. case WM_HSCROLL:
  243. if (GetDlgCtrlID((HWND)lParam)==IDC_PREAMP)
  244. UpdatePreamp(hwnd, (HWND)lParam);
  245. return 0;
  246. }
  247. return 0;
  248. }
  249. #define NUM_PAGES       2
  250. typedef struct
  251. {
  252. HWND htab;
  253. HWND hdlg;
  254. RECT r;
  255. HWND all[NUM_PAGES];
  256. } LOCALDATA;
  257. static void ScreenToClientRect(HWND hwnd, RECT *rect)
  258. {
  259. POINT pt = { rect->left, rect->top };
  260. ScreenToClient(hwnd, &pt);
  261. rect->left = pt.x;
  262. rect->top  = pt.y;
  263. pt.x = rect->right;
  264. pt.y = rect->bottom;
  265. ScreenToClient(hwnd, &pt);
  266. rect->right  = pt.x;
  267. rect->bottom = pt.y;
  268. }
  269. static void SendCommand(HWND hwnd, int command)
  270. {
  271. LOCALDATA *data = (LOCALDATA*)GetWindowLong(hwnd, GWL_USERDATA);
  272. SendMessage(data->hdlg, WM_COMMAND, command, 0);
  273. }
  274. static void BroadcastCommand(HWND hwnd, int command)
  275. {
  276. LOCALDATA *data = (LOCALDATA*)GetWindowLong(hwnd, GWL_USERDATA);
  277. int i;
  278. for (i=0; i<NUM_PAGES; i++)
  279. SendMessage(data->all[i], WM_COMMAND, command, 0);
  280. }
  281. static void OnSelChange(HWND hwnd)
  282. {
  283. LOCALDATA *data = (LOCALDATA*)GetWindowLong(hwnd, GWL_USERDATA);
  284. int index = TabCtrl_GetCurSel(data->htab);
  285. if (index < 0) return;
  286. /* hide previous */
  287. if (data->hdlg)
  288. ShowWindow(data->hdlg, SW_HIDE);
  289. /* display */
  290. data->hdlg = data->all[index];
  291. SetWindowPos(data->hdlg, HWND_TOP, data->r.left, data->r.top, data->r.right-data->r.left, data->r.bottom-data->r.top, SWP_SHOWWINDOW);
  292. SetFocus(hwnd);
  293. }
  294. static INT_PTR CALLBACK DialogProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  295. {
  296. static activePage = 0;
  297. switch (msg)
  298. {
  299. /* init */
  300. case WM_INITDIALOG:
  301. {
  302. LOCALDATA *data = LocalAlloc(LPTR, sizeof(LOCALDATA));
  303. HINSTANCE inst = (HINSTANCE)lParam;
  304. TCITEM item;
  305. /* init */
  306. SetWindowLong(hwnd, GWL_USERDATA, (LONG)data);
  307. data->htab = GetDlgItem(hwnd, IDC_TABS);
  308. data->hdlg = NULL;
  309. /* add pages */
  310. item.mask = TCIF_TEXT;
  311. data->all[0] = CreateDialog(inst, MAKEINTRESOURCE(IDD_CONFIG_GENERAL), hwnd, GeneralProc);
  312. item.pszText = "General";
  313. TabCtrl_InsertItem(data->htab, 0, &item);
  314. data->all[1] = CreateDialog(inst, MAKEINTRESOURCE(IDD_CONFIG_OUTPUT), hwnd, OutputProc);
  315. item.pszText = "Output";
  316. TabCtrl_InsertItem(data->htab, 1, &item);
  317. /* get rect (after adding pages) */
  318. GetWindowRect(data->htab, &data->r);
  319. ScreenToClientRect(hwnd, &data->r);
  320. TabCtrl_AdjustRect(data->htab, 0, &data->r);
  321. /* simulate item change */
  322. TabCtrl_SetCurSel(data->htab, activePage);
  323. OnSelChange(hwnd);
  324. }
  325. return TRUE;
  326. /* destory */
  327. case WM_DESTROY:
  328. {
  329. LOCALDATA *data = (LOCALDATA*)GetWindowLong(hwnd, GWL_USERDATA);
  330. int i;
  331. activePage = TabCtrl_GetCurSel(data->htab);
  332. for (i=0; i<NUM_PAGES; i++)
  333. DestroyWindow(data->all[i]);
  334. LocalFree(data);
  335. }
  336. break;
  337. /* commands */
  338. case WM_COMMAND:
  339. switch (LOWORD(wParam))
  340. {
  341. /* ok/cancel */
  342. case IDOK:
  343. BroadcastCommand(hwnd, IDOK);
  344. /* fall through */
  345. case IDCANCEL:
  346. EndDialog(hwnd, LOWORD(wParam));
  347. return TRUE;
  348. case IDC_RESET:
  349. SendCommand(hwnd, IDC_RESET);
  350. break;
  351. }
  352. break;
  353. /* notification */
  354. case WM_NOTIFY:
  355. if (LOWORD(wParam) == IDC_TABS)
  356. {
  357. NMHDR *hdr = (NMHDR*)lParam;
  358. switch (hdr->code)
  359. {
  360. case TCN_SELCHANGE:
  361. OnSelChange(hwnd);
  362. break;
  363. }
  364. }
  365. break;
  366. }
  367. return 0;
  368. }
  369. int DoConfig(HINSTANCE inst, HWND parent)
  370. {
  371. return DialogBoxParam(inst, MAKEINTRESOURCE(IDD_CONFIG), parent, DialogProc, (LONG)inst) == IDOK;
  372. }