OSDN Git Service

最初のコミット
[winaudioj/wasapi2.git] / wasapi2 / config_tab_dialog.cpp
1 /*\r
2 ==============================================================================\r
3 \r
4 Copyright 2005-11 by Satoshi Fujiwara.\r
5 \r
6 async can be redistributed and/or modified under the terms of the\r
7 GNU General Public License, as published by the Free Software Foundation;\r
8 either version 2 of the License, or (at your option) any later version.\r
9 \r
10 async is distributed in the hope that it will be useful,\r
11 but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13 GNU General Public License for more details.\r
14 \r
15 You should have received a copy of the GNU General Public License\r
16 along with async; if not, visit www.gnu.org/licenses or write to the\r
17 Free Software Foundation, Inc., 59 Temple Place, Suite 330, \r
18 Boston, MA 02111-1307 USA\r
19 \r
20 ==============================================================================\r
21 */\r
22 /* ToDo\r
23 \r
24 TODO: リサイズに対応する\r
25 \r
26 */\r
27 \r
28 #include "stdafx.h"\r
29 #include "resource.h"\r
30 #define BOOST_ASSIGN_MAX_PARAMS 7\r
31 #include <boost/assign.hpp>\r
32 #include <boost/assign/ptr_list_of.hpp>\r
33 #include <boost/assign/ptr_list_inserter.hpp>\r
34 #include <boost/foreach.hpp>\r
35 \r
36 #if _DEBUG\r
37 #define _CRTDBG_MAP_ALLOC\r
38 #include <crtdbg.h>\r
39 #define new new(_NORMAL_BLOCK, __FILE__, __LINE__)\r
40 #endif\r
41 \r
42 #include "sf_windows.h"\r
43 #include "CommDlg.h"\r
44 #include "icon.h"\r
45 #include "timer.h"\r
46 #include "exception.h"\r
47 #include "application.h"\r
48 #include "config_tab_dialog.h"\r
49 \r
50 #define THROW_IFERR(hres) \\r
51   if (FAILED(hres)) { throw sf::win32_error_exception(hres); }\r
52 \r
53 #ifndef HINST_THISCOMPONENT\r
54 EXTERN_C IMAGE_DOS_HEADER __ImageBase;\r
55 #define HINST_THISCOMPONENT ((HINSTANCE)&__ImageBase)\r
56 #endif\r
57 \r
58 namespace sf \r
59 {\r
60     config_tab_dialog::config_tab_dialog(sf::base_window& parent_window,HWND tab_hwnd,int tab_id,const std::wstring& menu_name,const std::wstring& name,HINSTANCE inst,LPCTSTR temp)\r
61       : tab_dialog_base(parent_window,tab_hwnd,tab_id,menu_name,name,inst,temp)\r
62       ,update_config_dialog_(false)\r
63       ,edit_output_config_(false)\r
64       ,edit_input_config_(false)\r
65     {\r
66       create();\r
67       hide();\r
68     }\r
69 \r
70     LRESULT config_tab_dialog::window_proc(HWND hwnd,uint32_t message, WPARAM wParam, LPARAM lParam)\r
71     {\r
72       switch(message)\r
73       {\r
74       case WM_INITDIALOG:\r
75         init_config_dialog();\r
76         return TRUE;\r
77       case WM_COMMAND:\r
78         {\r
79           switch(LOWORD(wParam)){\r
80             // ---------------------------------\r
81             // 出力\r
82             // ---------------------------------\r
83           case IDC_ENDPOINT_DEVICE:\r
84             // エンドポイントデバイス\r
85             if(HIWORD(wParam) == CBN_SELCHANGE && !update_config_dialog_)\r
86             {\r
87               edit_output_config_ = true;\r
88               current_output_driver_index_ = SendMessage(GetDlgItem(hwnd,IDC_ENDPOINT_DEVICE),CB_GETITEMDATA,SendMessage(GetDlgItem(hwnd,IDC_ENDPOINT_DEVICE),CB_GETCURSEL,0,0),0);\r
89               update_config_dialog();\r
90             }\r
91             return TRUE;\r
92           case IDC_SAMPLE_BIT:\r
93             // サンプルビット数\r
94             if(HIWORD(wParam) == CBN_SELCHANGE && !update_config_dialog_)\r
95             {\r
96               edit_output_config_ = true;\r
97               editing_output_params_.bits =  SendMessage(GetDlgItem(hwnd,IDC_SAMPLE_BIT),CB_GETITEMDATA,SendMessage(GetDlgItem(hwnd,IDC_SAMPLE_BIT),CB_GETCURSEL,0,0),0);\r
98               update_config_dialog();\r
99             }\r
100             return TRUE;\r
101           case IDC_VALID_SAMPLE_BITS:\r
102             // 実際のサンプルビット数\r
103             if(HIWORD(wParam) == CBN_SELCHANGE &&  !update_config_dialog_)\r
104             {\r
105               edit_output_config_ = true;\r
106               editing_output_params_.valid_bits =  SendMessage(GetDlgItem(hwnd,IDC_VALID_SAMPLE_BITS),CB_GETITEMDATA,SendMessage(GetDlgItem(hwnd,IDC_VALID_SAMPLE_BITS),CB_GETCURSEL,0,0),0);\r
107               update_config_dialog();\r
108             }\r
109             return TRUE;\r
110           case IDC_SAMPLE_RATE:\r
111             // サンプル周波数\r
112             if(HIWORD(wParam) == CBN_SELCHANGE &&  !update_config_dialog_)\r
113             {\r
114               edit_output_config_ = true;\r
115               editing_output_params_.sample_rate =  SendMessage(GetDlgItem(hwnd,IDC_SAMPLE_RATE),CB_GETITEMDATA,SendMessage(GetDlgItem(hwnd,IDC_SAMPLE_RATE),CB_GETCURSEL,0,0),0);\r
116               update_config_dialog();\r
117             }\r
118             return TRUE;\r
119           case IDC_EXC_MODE:\r
120             // 排他モード\r
121             {\r
122               if(!update_config_dialog_){\r
123                 edit_output_config_ = true;\r
124 \r
125                 //application::instance()->exclusive_mode(::SendMessage(GetDlgItem(hwnd,IDC_EXC_MODE),BM_GETCHECK,0,0) == BST_CHECKED);\r
126                 editing_output_params_.exclusive_mode = ::SendMessage(GetDlgItem(hwnd,IDC_EXC_MODE),BM_GETCHECK,0,0) == BST_CHECKED;\r
127                 update_config_dialog();\r
128               }\r
129             }\r
130             return TRUE;\r
131           case IDC_EVENT_MODE:\r
132             // イベントモード\r
133             {\r
134               if(!update_config_dialog_){\r
135                 //application::instance()->exclusive_mode(::SendMessage(GetDlgItem(hwnd,IDC_EXC_MODE),BM_GETCHECK,0,0) == BST_CHECKED);\r
136                 editing_output_params_.event_mode = ::SendMessage(GetDlgItem(hwnd,IDC_EVENT_MODE),BM_GETCHECK,0,0) == BST_CHECKED;\r
137                 edit_output_config_ = true;\r
138                 update_config_dialog();\r
139               }\r
140             }\r
141             return TRUE;\r
142 \r
143           case IDC_LATENCY:\r
144             // レイテンシ\r
145             if(HIWORD(wParam) == EN_UPDATE  &&  !update_config_dialog_)\r
146             {\r
147               edit_output_config_ = true;\r
148               enable_control(hwnd_,IDC_APPLY,true);\r
149               enable_control(hwnd_,IDC_CANCEL,true);\r
150               //BOOL success = FALSE;\r
151               //int res = 0;\r
152               //res = GetDlgItemInt(hwnd_,IDC_LATENCY,&success,TRUE);\r
153               //if(success)\r
154               //{\r
155               //  editing_output_params_.latency = res;\r
156               //} else {\r
157               //  message_box(L"不正な値が設定されています。",L"エラー",MB_OK);\r
158               //}\r
159             }\r
160             return TRUE;\r
161             // ---------------------------------\r
162             // 入力\r
163             // ---------------------------------\r
164           case IDC_INPUT_ENDPOINT_DEVICE:\r
165             if(HIWORD(wParam) == CBN_SELCHANGE && !update_config_dialog_)\r
166             {\r
167               edit_input_config_ = true;\r
168               current_input_driver_index_ \r
169                 = SendMessage(\r
170                 GetDlgItem(hwnd,IDC_INPUT_ENDPOINT_DEVICE),\r
171                 CB_GETITEMDATA,\r
172                 SendMessage(GetDlgItem(hwnd,IDC_INPUT_ENDPOINT_DEVICE),CB_GETCURSEL,0,0),\r
173                 0);\r
174               update_config_dialog();\r
175             }\r
176             return TRUE;\r
177           case IDC_INPUT_SAMPLE_BIT:\r
178             if(HIWORD(wParam) == CBN_SELCHANGE && !update_config_dialog_)\r
179             {\r
180               edit_input_config_ = true;\r
181               editing_input_params_.bits \r
182                 =  SendMessage(\r
183                 GetDlgItem(hwnd,IDC_INPUT_SAMPLE_BIT),\r
184                 CB_GETITEMDATA,\r
185                 SendMessage(GetDlgItem(hwnd,IDC_INPUT_SAMPLE_BIT),CB_GETCURSEL,0,0)\r
186                 ,0);\r
187               update_config_dialog();\r
188             }\r
189             return TRUE;\r
190           case IDC_INPUT_VALID_SAMPLE_BITS:\r
191             if(HIWORD(wParam) == CBN_SELCHANGE && !update_config_dialog_)\r
192             {\r
193               edit_input_config_ = true;\r
194               editing_input_params_.valid_bits \r
195                 =  SendMessage(\r
196                 GetDlgItem(hwnd,IDC_INPUT_VALID_SAMPLE_BITS),\r
197                 CB_GETITEMDATA,\r
198                 SendMessage(GetDlgItem(hwnd,IDC_INPUT_VALID_SAMPLE_BITS),CB_GETCURSEL,0,0),\r
199                 0);\r
200               update_config_dialog();\r
201             }\r
202             return TRUE;\r
203           case IDC_INPUT_SAMPLE_RATE:\r
204             if(HIWORD(wParam) == CBN_SELCHANGE &&  !update_config_dialog_)\r
205             {\r
206               edit_input_config_ = true;\r
207               editing_input_params_.sample_rate\r
208                 =  SendMessage(\r
209                 GetDlgItem(hwnd,IDC_INPUT_SAMPLE_RATE),\r
210                 CB_GETITEMDATA,\r
211                 SendMessage(GetDlgItem(hwnd,IDC_INPUT_SAMPLE_RATE),CB_GETCURSEL,0,0),\r
212                 0);\r
213               update_config_dialog();\r
214             }\r
215             return TRUE;\r
216           case IDC_INPUT_EXC_MODE:\r
217             {\r
218               if(!update_config_dialog_){\r
219                 edit_input_config_ = true;\r
220 \r
221                 //application::instance()->exclusive_mode(::SendMessage(GetDlgItem(hwnd,IDC_INPUT_EXC_MODE),BM_GETCHECK,0,0) == BST_CHECKED);\r
222                 editing_input_params_.exclusive_mode \r
223                   = ::SendMessage(GetDlgItem(hwnd,IDC_INPUT_EXC_MODE),BM_GETCHECK,0,0) \r
224                   == BST_CHECKED;\r
225                 update_config_dialog();\r
226               }\r
227             }\r
228             return TRUE;\r
229           case IDC_INPUT_EVENT_MODE:\r
230             {\r
231               if(!update_config_dialog_){\r
232                 //application::instance()->exclusive_mode(::SendMessage(GetDlgItem(hwnd,IDC_INPUT_EXC_MODE),BM_GETCHECK,0,0) == BST_CHECKED);\r
233                 editing_input_params_.event_mode \r
234                   = ::SendMessage(GetDlgItem(hwnd,IDC_INPUT_EVENT_MODE),BM_GETCHECK,0,0) \r
235                   == BST_CHECKED;\r
236                 edit_input_config_ = true;\r
237                 update_config_dialog();\r
238               }\r
239             }\r
240             return TRUE;\r
241           case IDC_INPUT_LATENCY:\r
242             if(HIWORD(wParam) == EN_UPDATE  &&  !update_config_dialog_)\r
243             {\r
244               edit_input_config_ = true;\r
245               enable_control(hwnd_,IDC_APPLY,true);\r
246               enable_control(hwnd_,IDC_CANCEL,true);\r
247               //BOOL success = FALSE;\r
248               //int res = 0;\r
249               //res = GetDlgItemInt(hwnd_,IDC_INPUT_LATENCY,&success,TRUE);\r
250               //if(success)\r
251               //{\r
252               //  editing_input_params_.latency = res;\r
253               //} else {\r
254               //  message_box(L"不正な値が設定されています。",L"エラー",MB_OK);\r
255               //}\r
256             }\r
257             return TRUE;\r
258             // ---------------------------------\r
259             // 設定反映\r
260             // ---------------------------------\r
261           case IDC_APPLY:\r
262             {\r
263               BOOL success = FALSE;\r
264               REFERENCE_TIME res(0);\r
265 \r
266               // 出力デバイス設定\r
267 \r
268               if(edit_output_config_){\r
269                 res = GetDlgItemInt(hwnd_,IDC_LATENCY,&success,TRUE);\r
270                 if(success)\r
271                 {\r
272                   editing_output_params_.latency = res * 10000;\r
273                 } else {\r
274                   message_box(L"レイテンシに不正な値が設定されています。",L"エラー",MB_OK);\r
275                 }\r
276                 try {\r
277                   application::instance()->apply_output_device_config\r
278                     (current_output_driver_index_,editing_output_params_);\r
279                   edit_output_config_ = false;\r
280                 } catch (...) \r
281                 {\r
282                   application::instance()->apply_output_device_config\r
283                     (wasapi_device_manager::instance()->current_output_device_index(),\r
284                     wasapi_device_manager::instance()->current_output_device().params);\r
285                   edit_output_config_ = true;\r
286                 }\r
287               }\r
288 \r
289               // 入力デバイス設定\r
290 \r
291               if(edit_input_config_){\r
292                 res = GetDlgItemInt(hwnd_,IDC_INPUT_LATENCY,&success,TRUE);\r
293                 if(success)\r
294                 {\r
295                   editing_input_params_.latency = res * 10000;\r
296                 } else {\r
297                   message_box(L"レイテンシに不正な値が設定されています。",L"エラー",MB_OK);\r
298                 }\r
299                 try {\r
300                   application::instance()->apply_input_device_config\r
301                     (current_input_driver_index_,editing_input_params_);\r
302                   edit_input_config_ = false;\r
303                 } catch (...) \r
304                 {\r
305                   application::instance()->apply_input_device_config\r
306                     (wasapi_device_manager::instance()->current_input_device_index(),\r
307                     wasapi_device_manager::instance()->current_input_device().params);\r
308                   edit_input_config_ = true;\r
309                 }\r
310               }\r
311               update_config_dialog();\r
312             }\r
313             return TRUE;\r
314             // ---------------------------------\r
315             // 設定キャンセル\r
316             // ---------------------------------\r
317           case IDC_CANCEL:\r
318             {\r
319               wasapi_device_manager::ptr m(sf::wasapi_device_manager::instance());\r
320 \r
321               if(edit_output_config_){\r
322                 editing_output_params_ = m->current_output_device().params;\r
323                 edit_output_config_ = false;\r
324               }\r
325 \r
326               if(edit_input_config_){\r
327                 editing_input_params_ = m->current_input_device().params;\r
328                 edit_input_config_ = false;\r
329               }\r
330 \r
331               update_config_dialog();\r
332               return TRUE;\r
333             }\r
334           }\r
335           return FALSE;\r
336         }\r
337       case WM_CTLCOLORDLG:\r
338       case WM_CTLCOLORSTATIC:\r
339       case WM_CTLCOLORBTN:\r
340       case WM_CTLCOLOR:\r
341         SetBkMode((HDC)wParam,TRANSPARENT);\r
342         return  (LRESULT)GetStockObject( /* NULL_BRUSH */WHITE_BRUSH );\r
343       case WM_ERASEBKGND:\r
344         return FALSE;\r
345       }\r
346       return FALSE;  \r
347     };\r
348 \r
349   void config_tab_dialog::init_config_dialog()\r
350   {\r
351 \r
352     wasapi_device_manager::ptr m(sf::wasapi_device_manager::instance());\r
353 \r
354     // バックアップ\r
355     {\r
356       // 出力\r
357       editing_output_params_ = m->current_output_device().params;\r
358       wasapi_device_manager::device_infos_t& i(m->output_device_infos());\r
359 \r
360       for(int c = 0;c < i.size();++c)\r
361       {\r
362         if(i[c].is_selected){\r
363           current_output_driver_index_ = c;\r
364         }\r
365       }\r
366     }\r
367 \r
368     {\r
369       // 入力\r
370       editing_input_params_ = m->current_input_device().params;\r
371       wasapi_device_manager::device_infos_t& i(m->input_device_infos());\r
372       for(int c = 0;c < i.size();++c)\r
373       {\r
374         if(i[c].is_selected){\r
375           current_input_driver_index_ = c;\r
376         }\r
377       }\r
378     }\r
379     edit_output_config_ = false;\r
380     edit_input_config_ = false;\r
381     update_config_dialog();\r
382     //i[current_index].support_formats\r
383 \r
384   }\r
385 \r
386  void config_tab_dialog::update_config_dialog()\r
387   {\r
388     update_config_dialog_ = true;\r
389     application::ptr app(application::instance());\r
390 \r
391     // ----------------------------------------\r
392     enable_control(hwnd_,IDC_APPLY,edit_output_config_ || edit_input_config_);\r
393     enable_control(hwnd_,IDC_CANCEL,edit_output_config_ || edit_input_config_);\r
394 \r
395 \r
396     // デバイスコンボボックスのセットアップ\r
397     wasapi_device_manager::ptr m(sf::wasapi_device_manager::instance());\r
398 \r
399     // ==========================================\r
400     // 出力設定\r
401     // ==========================================\r
402     { \r
403       wasapi_device_manager::device_infos_t& i(m->output_device_infos());\r
404 \r
405       HWND hwnd_endp = GetDlgItem(hwnd_,IDC_ENDPOINT_DEVICE);\r
406       SendMessage(hwnd_endp,CB_RESETCONTENT,0,0);\r
407 \r
408       for(int c = 0,e = i.size(); c < e;++c)\r
409       {\r
410         SendMessage(hwnd_endp,CB_ADDSTRING,0,(LPARAM)i[c].device_friendly_name.c_str());\r
411         SendMessage(hwnd_endp,CB_SETITEMDATA,c,c);\r
412         if(c == current_output_driver_index_)\r
413         {\r
414           SendMessage(hwnd_endp,CB_SETCURSEL,c,0);\r
415         }\r
416       }\r
417 \r
418       typedef wasapi_device_manager::format_map_type fmts_t;\r
419       fmts_t& fmts = i[current_output_driver_index_].support_formats;\r
420       //// \r
421       HWND hwnd_smp_bits = GetDlgItem(hwnd_,IDC_SAMPLE_BIT);\r
422     \r
423       SendMessage(hwnd_smp_bits,CB_RESETCONTENT,0,0);\r
424       uint32_t share_mode = AUDCLNT_SHAREMODE_SHARED;\r
425       if(editing_output_params_.exclusive_mode)\r
426       {\r
427         share_mode = AUDCLNT_SHAREMODE_EXCLUSIVE;\r
428         ::SendDlgItemMessage(hwnd_,IDC_EXC_MODE,BM_SETCHECK,BST_CHECKED ,0);\r
429       } else {\r
430         ::SendDlgItemMessage(hwnd_,IDC_EXC_MODE,BM_SETCHECK,BST_UNCHECKED ,0);\r
431       }\r
432 \r
433       if(editing_output_params_.event_mode)\r
434       {\r
435         ::SendDlgItemMessage(hwnd_,IDC_EVENT_MODE,BM_SETCHECK,BST_CHECKED ,0);\r
436       } else {\r
437         ::SendDlgItemMessage(hwnd_,IDC_EVENT_MODE,BM_SETCHECK,BST_UNCHECKED ,0);\r
438       }\r
439 \r
440       typedef fmts_t::mapped_type fsmpbits_t;\r
441       fsmpbits_t& fsmpbits = fmts[share_mode];\r
442       {\r
443         int c = 0;\r
444         std::for_each(fsmpbits.begin(),fsmpbits.end(),\r
445           [&](fsmpbits_t::value_type & pair)\r
446           {\r
447             SendMessage(hwnd_smp_bits,CB_ADDSTRING,0,(LPARAM)(boost::lexical_cast<std::wstring>(pair.first).c_str()));\r
448             SendMessage(hwnd_smp_bits,CB_SETITEMDATA,c,pair.first);\r
449             if(editing_output_params_.bits == pair.first)\r
450             {\r
451               SendMessage(hwnd_smp_bits,CB_SETCURSEL,c,0);\r
452             }\r
453             ++c;\r
454           }\r
455         );\r
456       }\r
457 \r
458       // ----------------------------------------\r
459       // ----------------------------------------\r
460     \r
461       typedef wasapi_device_manager::format_map_type::mapped_type::mapped_type fmts_vbits_t;\r
462 \r
463       fmts_vbits_t& fmts_vbits = fmts[share_mode][editing_output_params_.bits];\r
464       int cnt_vbits = 0;\r
465       HWND hwnd_valid_bits = GetDlgItem(hwnd_,IDC_VALID_SAMPLE_BITS);\r
466       SendMessage(hwnd_valid_bits,CB_RESETCONTENT,0,0);\r
467       std::for_each(fmts_vbits.begin(),fmts_vbits.end(),\r
468         [&](fmts_vbits_t::value_type& pair_vbits)\r
469       {\r
470         SendMessage(hwnd_valid_bits,CB_ADDSTRING,0,(LPARAM)(boost::lexical_cast<std::wstring>(pair_vbits.first).c_str()));\r
471         SendMessage(hwnd_valid_bits,CB_SETITEMDATA,cnt_vbits,pair_vbits.first);\r
472         if(pair_vbits.first == editing_output_params_.valid_bits)\r
473         {\r
474           SendMessage(hwnd_valid_bits,CB_SETCURSEL,cnt_vbits,0);\r
475         }\r
476         cnt_vbits++;\r
477       }\r
478       );\r
479 \r
480       // ----------------------------------------\r
481       // ----------------------------------------\r
482       typedef wasapi_device_manager::format_map_type::mapped_type::mapped_type::mapped_type fmts_channels_t;\r
483       fmts_channels_t & \r
484         fmts_channels = fmts[share_mode][editing_output_params_.bits][editing_output_params_.valid_bits];\r
485       //typedef decltype(fmts_channels) fmts_channels_t;\r
486       int cnt_channels = 0;\r
487       HWND hwnd_channels = GetDlgItem(hwnd_,IDC_CHANNEL);\r
488       SendMessage(hwnd_channels,CB_RESETCONTENT,0,0);\r
489       std::for_each(fmts_channels.begin(),fmts_channels.end(),\r
490         [&](fmts_channels_t::value_type & pair_channel)\r
491       {\r
492         SendMessage(hwnd_channels,CB_ADDSTRING,0,(LPARAM)(boost::lexical_cast<std::wstring>(pair_channel.first).c_str()));\r
493         SendMessage(hwnd_channels,CB_SETITEMDATA,cnt_channels,pair_channel.first);\r
494         if(pair_channel.first == editing_output_params_.channel)\r
495         {\r
496           SendMessage(hwnd_channels,CB_SETCURSEL,cnt_channels,0);\r
497         }\r
498         cnt_channels++;\r
499       }\r
500       );\r
501 \r
502       // ----------------------------------------\r
503       // ----------------------------------------\r
504 \r
505       typedef wasapi_device_manager::format_map_type::mapped_type::mapped_type::mapped_type::mapped_type fmts_sample_rates_t;\r
506       fmts_sample_rates_t& fmts_sample_rates \r
507         = fmts[share_mode][editing_output_params_.bits][editing_output_params_.valid_bits][editing_output_params_.channel];\r
508       int cnt_samples = 0;\r
509       HWND hwnd_sample = GetDlgItem(hwnd_,IDC_SAMPLE_RATE);\r
510       SendMessage(hwnd_sample,CB_RESETCONTENT,0,0);\r
511       std::for_each(fmts_sample_rates.begin(),fmts_sample_rates.end(),\r
512         [&](fmts_sample_rates_t::value_type & pair_sample)\r
513       {\r
514         SendMessage(hwnd_sample,CB_ADDSTRING,0,(LPARAM)(boost::lexical_cast<std::wstring>(pair_sample.first).c_str()));\r
515         SendMessage(hwnd_sample,CB_SETITEMDATA,cnt_samples,pair_sample.first);\r
516         if(pair_sample.first == editing_output_params_.sample_rate)\r
517         {\r
518           SendMessage(hwnd_sample,CB_SETCURSEL,cnt_samples,0);\r
519         }\r
520         cnt_samples++;\r
521       }\r
522       );\r
523 \r
524 \r
525       // ----------------------------------------\r
526       // ----------------------------------------\r
527       SetDlgItemInt(hwnd_,IDC_LATENCY,editing_output_params_.latency/10000,TRUE);\r
528       SetDlgItemText(hwnd_,IDC_MIN_MAX_LATENCY,(boost::wformat(L"(%dms ~ %dms)") \r
529         % (i[current_output_driver_index_].latency_minimum / 10000) \r
530         % (i[current_output_driver_index_].latency_default / 10000)).str().c_str());\r
531     } // 出力ダイアログ\r
532 \r
533     // ===================================================================\r
534     // 入力設定\r
535     // ===================================================================\r
536     { \r
537       wasapi_device_manager::device_infos_t& i(m->input_device_infos());\r
538 \r
539       HWND hwnd_endp = GetDlgItem(hwnd_,IDC_INPUT_ENDPOINT_DEVICE);\r
540       SendMessage(hwnd_endp,CB_RESETCONTENT,0,0);\r
541 \r
542       for(int c = 0,e = i.size(); c < e;++c)\r
543       {\r
544         SendMessage(hwnd_endp,CB_ADDSTRING,0,(LPARAM)i[c].device_friendly_name.c_str());\r
545         SendMessage(hwnd_endp,CB_SETITEMDATA,c,c);\r
546         if(c == current_input_driver_index_)\r
547         {\r
548           SendMessage(hwnd_endp,CB_SETCURSEL,c,0);\r
549         }\r
550       }\r
551 \r
552       typedef wasapi_device_manager::format_map_type fmts_t;\r
553       fmts_t& fmts = i[current_input_driver_index_].support_formats;\r
554       //// \r
555       HWND hwnd_smp_bits = GetDlgItem(hwnd_,IDC_INPUT_SAMPLE_BIT);\r
556     \r
557       SendMessage(hwnd_smp_bits,CB_RESETCONTENT,0,0);\r
558       uint32_t share_mode = AUDCLNT_SHAREMODE_SHARED;\r
559       if(editing_input_params_.exclusive_mode)\r
560       {\r
561         share_mode = AUDCLNT_SHAREMODE_EXCLUSIVE;\r
562         ::SendDlgItemMessage(hwnd_,IDC_INPUT_EXC_MODE,BM_SETCHECK,BST_CHECKED ,0);\r
563       } else {\r
564         ::SendDlgItemMessage(hwnd_,IDC_INPUT_EXC_MODE,BM_SETCHECK,BST_UNCHECKED ,0);\r
565       }\r
566 \r
567       if(editing_input_params_.event_mode)\r
568       {\r
569         ::SendDlgItemMessage(hwnd_,IDC_INPUT_EVENT_MODE,BM_SETCHECK,BST_CHECKED ,0);\r
570       } else {\r
571         ::SendDlgItemMessage(hwnd_,IDC_INPUT_EVENT_MODE,BM_SETCHECK,BST_UNCHECKED ,0);\r
572       }\r
573 \r
574       typedef fmts_t::mapped_type fsmpbits_t;\r
575       fsmpbits_t& fsmpbits = fmts[share_mode];\r
576       {\r
577         int c = 0;\r
578         std::for_each(fsmpbits.begin(),fsmpbits.end(),\r
579           [&](fsmpbits_t::value_type & pair)\r
580           {\r
581             SendMessage(hwnd_smp_bits,CB_ADDSTRING,0,(LPARAM)(boost::lexical_cast<std::wstring>(pair.first).c_str()));\r
582             SendMessage(hwnd_smp_bits,CB_SETITEMDATA,c,pair.first);\r
583             if(editing_input_params_.bits == pair.first)\r
584             {\r
585               SendMessage(hwnd_smp_bits,CB_SETCURSEL,c,0);\r
586             }\r
587             ++c;\r
588           }\r
589         );\r
590       }\r
591 \r
592       // ----------------------------------------\r
593       // ----------------------------------------\r
594     \r
595       typedef wasapi_device_manager::format_map_type::mapped_type::mapped_type fmts_vbits_t;\r
596 \r
597       fmts_vbits_t& fmts_vbits = fmts[share_mode][editing_input_params_.bits];\r
598       int cnt_vbits = 0;\r
599       HWND hwnd_valid_bits = GetDlgItem(hwnd_,IDC_INPUT_VALID_SAMPLE_BITS);\r
600       SendMessage(hwnd_valid_bits,CB_RESETCONTENT,0,0);\r
601       std::for_each(fmts_vbits.begin(),fmts_vbits.end(),\r
602         [&](fmts_vbits_t::value_type& pair_vbits)\r
603       {\r
604         SendMessage(hwnd_valid_bits,CB_ADDSTRING,0,(LPARAM)(boost::lexical_cast<std::wstring>(pair_vbits.first).c_str()));\r
605         SendMessage(hwnd_valid_bits,CB_SETITEMDATA,cnt_vbits,pair_vbits.first);\r
606         if(pair_vbits.first == editing_input_params_.valid_bits)\r
607         {\r
608           SendMessage(hwnd_valid_bits,CB_SETCURSEL,cnt_vbits,0);\r
609         }\r
610         cnt_vbits++;\r
611       }\r
612       );\r
613 \r
614       // ----------------------------------------\r
615       // ----------------------------------------\r
616       typedef wasapi_device_manager::format_map_type::mapped_type::mapped_type::mapped_type fmts_channels_t;\r
617       fmts_channels_t & \r
618         fmts_channels = fmts[share_mode][editing_input_params_.bits][editing_input_params_.valid_bits];\r
619       //typedef decltype(fmts_channels) fmts_channels_t;\r
620       int cnt_channels = 0;\r
621       HWND hwnd_channels = GetDlgItem(hwnd_,IDC_INPUT_CHANNEL);\r
622       SendMessage(hwnd_channels,CB_RESETCONTENT,0,0);\r
623       std::for_each(fmts_channels.begin(),fmts_channels.end(),\r
624         [&](fmts_channels_t::value_type & pair_channel)\r
625       {\r
626         SendMessage(hwnd_channels,CB_ADDSTRING,0,(LPARAM)(boost::lexical_cast<std::wstring>(pair_channel.first).c_str()));\r
627         SendMessage(hwnd_channels,CB_SETITEMDATA,cnt_channels,pair_channel.first);\r
628         if(pair_channel.first == editing_input_params_.channel)\r
629         {\r
630           SendMessage(hwnd_channels,CB_SETCURSEL,cnt_channels,0);\r
631         }\r
632         cnt_channels++;\r
633       }\r
634       );\r
635 \r
636       // ----------------------------------------\r
637       // ----------------------------------------\r
638 \r
639       typedef wasapi_device_manager::format_map_type::mapped_type::mapped_type::mapped_type::mapped_type fmts_sample_rates_t;\r
640       fmts_sample_rates_t& fmts_sample_rates \r
641         = fmts[share_mode][editing_input_params_.bits][editing_input_params_.valid_bits][editing_input_params_.channel];\r
642       int cnt_samples = 0;\r
643       HWND hwnd_sample = GetDlgItem(hwnd_,IDC_INPUT_SAMPLE_RATE);\r
644       SendMessage(hwnd_sample,CB_RESETCONTENT,0,0);\r
645       std::for_each(fmts_sample_rates.begin(),fmts_sample_rates.end(),\r
646         [&](fmts_sample_rates_t::value_type & pair_sample)\r
647       {\r
648         SendMessage(hwnd_sample,CB_ADDSTRING,0,(LPARAM)(boost::lexical_cast<std::wstring>(pair_sample.first).c_str()));\r
649         SendMessage(hwnd_sample,CB_SETITEMDATA,cnt_samples,pair_sample.first);\r
650         if(pair_sample.first == editing_input_params_.sample_rate)\r
651         {\r
652           SendMessage(hwnd_sample,CB_SETCURSEL,cnt_samples,0);\r
653         }\r
654         cnt_samples++;\r
655       }\r
656       );\r
657 \r
658 \r
659       // ----------------------------------------\r
660       // ----------------------------------------\r
661       SetDlgItemInt(hwnd_,IDC_INPUT_LATENCY,editing_input_params_.latency/10000,TRUE);\r
662       SetDlgItemText(hwnd_,IDC_INPUT_MIN_MAX_LATENCY,(boost::wformat(L"(%dms ~ %dms)") \r
663         % (i[current_input_driver_index_].latency_minimum / 10000) \r
664         % (i[current_input_driver_index_].latency_default / 10000)).str().c_str());\r
665     } // 入力ダイアログ\r
666 \r
667     update_config_dialog_ = false;\r
668   }\r
669 \r
670   void config_tab_dialog::enable_config_dialog(bool value)\r
671   {\r
672     // 出力部分\r
673     enable_control(hwnd_,IDC_EXC_MODE,value);\r
674     enable_control(hwnd_,IDC_EVENT_MODE,value);\r
675     enable_control(hwnd_,IDC_ENDPOINT_DEVICE,value);\r
676     enable_control(hwnd_,IDC_SAMPLE_BIT,value);\r
677     enable_control(hwnd_,IDC_VALID_SAMPLE_BITS,value);\r
678     enable_control(hwnd_,IDC_SAMPLE_RATE,value);\r
679     enable_control(hwnd_,IDC_LATENCY,value);\r
680     enable_control(hwnd_,IDC_CHANNEL,value);\r
681     // 入力部分\r
682     enable_control(hwnd_,IDC_INPUT_EXC_MODE,value);\r
683     enable_control(hwnd_,IDC_INPUT_EVENT_MODE,value);\r
684     enable_control(hwnd_,IDC_INPUT_ENDPOINT_DEVICE,value);\r
685     enable_control(hwnd_,IDC_INPUT_SAMPLE_BIT,value);\r
686     enable_control(hwnd_,IDC_INPUT_VALID_SAMPLE_BITS,value);\r
687     enable_control(hwnd_,IDC_INPUT_SAMPLE_RATE,value);\r
688     enable_control(hwnd_,IDC_INPUT_LATENCY,value);\r
689     enable_control(hwnd_,IDC_INPUT_CHANNEL,value);\r
690     // 設定反映・キャンセル部分\r
691     if(value){\r
692       enable_control(hwnd_,IDC_APPLY,edit_output_config_ || edit_input_config_);\r
693       enable_control(hwnd_,IDC_CANCEL,edit_output_config_ || edit_input_config_);\r
694     } else {\r
695       enable_control(hwnd_,IDC_APPLY,false);\r
696       enable_control(hwnd_,IDC_CANCEL,false);\r
697     }\r
698 \r
699   }\r
700 \r
701   void config_tab_dialog::enable()\r
702   {\r
703     enable_config_dialog(true);\r
704   }\r
705 \r
706   void config_tab_dialog::disable()\r
707   {\r
708     enable_config_dialog(false);\r
709   }\r
710 \r
711 }\r
712 \r