xref: /reactos/dll/cpl/mmsys/audio.c (revision 781c247b)
1c2c66affSColin Finck /*
2c2c66affSColin Finck  *
3c2c66affSColin Finck  * PROJECT:         ReactOS Multimedia Control Panel
4c2c66affSColin Finck  * FILE:            dll/cpl/mmsys/audio.c
5c2c66affSColin Finck  * PURPOSE:         ReactOS Multimedia Control Panel
6c2c66affSColin Finck  * PROGRAMMER:      Thomas Weidenmueller <w3seek@reactos.com>
7c2c66affSColin Finck  *                  Johannes Anderwald <janderwald@reactos.com>
8c2c66affSColin Finck  *                  Dmitry Chapyshev <dmitry@reactos.org>
9c2c66affSColin Finck  */
10c2c66affSColin Finck 
11c2c66affSColin Finck #include "mmsys.h"
12c2c66affSColin Finck 
13c95f3358SStanislav Motylkov typedef struct _GLOBAL_DATA
14c95f3358SStanislav Motylkov {
15c95f3358SStanislav Motylkov     BOOL bNoAudioOut;
16c95f3358SStanislav Motylkov     BOOL bNoAudioIn;
17c95f3358SStanislav Motylkov     BOOL bNoMIDIOut;
18c95f3358SStanislav Motylkov 
19c95f3358SStanislav Motylkov     BOOL bAudioOutChanged;
20c95f3358SStanislav Motylkov     BOOL bAudioInChanged;
21c95f3358SStanislav Motylkov     BOOL bMIDIOutChanged;
22c95f3358SStanislav Motylkov 
23c95f3358SStanislav Motylkov } GLOBAL_DATA, *PGLOBAL_DATA;
24c95f3358SStanislav Motylkov 
25c2c66affSColin Finck VOID
26c95f3358SStanislav Motylkov InitAudioDlg(HWND hwnd, PGLOBAL_DATA pGlobalData)
27c2c66affSColin Finck {
28c2c66affSColin Finck     WAVEOUTCAPSW waveOutputPaps;
29*781c247bSThamatip Chitpong     WAVEINCAPSW waveInputPaps;
30*781c247bSThamatip Chitpong     MIDIOUTCAPSW midiOutCaps;
31*781c247bSThamatip Chitpong     WCHAR szNoDevices[256];
32c2c66affSColin Finck     UINT DevsNum;
33c2c66affSColin Finck     UINT uIndex;
34c2c66affSColin Finck     HWND hCB;
35c2c66affSColin Finck     LRESULT Res;
36c2c66affSColin Finck 
37*781c247bSThamatip Chitpong     LoadStringW(hApplet, IDS_NO_DEVICES, szNoDevices, _countof(szNoDevices));
38c2c66affSColin Finck 
39c2c66affSColin Finck     // Init sound playback devices list
40c2c66affSColin Finck     hCB = GetDlgItem(hwnd, IDC_DEVICE_PLAY_LIST);
41c2c66affSColin Finck 
42c2c66affSColin Finck     DevsNum = waveOutGetNumDevs();
43c2c66affSColin Finck     if (DevsNum < 1)
44c2c66affSColin Finck     {
45*781c247bSThamatip Chitpong         Res = SendMessageW(hCB, CB_ADDSTRING, 0, (LPARAM)szNoDevices);
46*781c247bSThamatip Chitpong         SendMessageW(hCB, CB_SETCURSEL, (WPARAM)Res, 0);
47c95f3358SStanislav Motylkov         pGlobalData->bNoAudioOut = TRUE;
48c2c66affSColin Finck     }
49c2c66affSColin Finck     else
50c2c66affSColin Finck     {
51c2c66affSColin Finck         WCHAR DefaultDevice[MAX_PATH] = {0};
52c2c66affSColin Finck         HKEY hKey;
53c2c66affSColin Finck         DWORD dwSize = sizeof(DefaultDevice);
54c2c66affSColin Finck         UINT DefaultIndex = 0;
55c2c66affSColin Finck 
56c2c66affSColin Finck         if (RegOpenKeyExW(HKEY_CURRENT_USER, L"Software\\Microsoft\\Multimedia\\Sound Mapper", 0, KEY_READ, &hKey) == ERROR_SUCCESS)
57c2c66affSColin Finck         {
58c2c66affSColin Finck             RegQueryValueExW(hKey, L"Playback", NULL, NULL, (LPBYTE)DefaultDevice, &dwSize);
59*781c247bSThamatip Chitpong             DefaultDevice[_countof(DefaultDevice) - 1] = UNICODE_NULL;
60c2c66affSColin Finck             RegCloseKey(hKey);
61c2c66affSColin Finck         }
62c2c66affSColin Finck 
63c2c66affSColin Finck         for (uIndex = 0; uIndex < DevsNum; uIndex++)
64c2c66affSColin Finck         {
65c2c66affSColin Finck             if (waveOutGetDevCapsW(uIndex, &waveOutputPaps, sizeof(waveOutputPaps)))
66c2c66affSColin Finck                 continue;
67c2c66affSColin Finck 
68c2c66affSColin Finck             Res = SendMessageW(hCB, CB_ADDSTRING, 0, (LPARAM)waveOutputPaps.szPname);
69c2c66affSColin Finck 
70c2c66affSColin Finck             if (CB_ERR != Res)
71c2c66affSColin Finck             {
72*781c247bSThamatip Chitpong                 SendMessageW(hCB, CB_SETITEMDATA, Res, (LPARAM)uIndex);
73*781c247bSThamatip Chitpong                 if (!_wcsicmp(waveOutputPaps.szPname, DefaultDevice))
74c2c66affSColin Finck                     DefaultIndex = Res;
75c2c66affSColin Finck             }
76c2c66affSColin Finck         }
77*781c247bSThamatip Chitpong         SendMessageW(hCB, CB_SETCURSEL, (WPARAM)DefaultIndex, 0);
78c2c66affSColin Finck     }
79c2c66affSColin Finck 
80c2c66affSColin Finck     // Init sound recording devices list
81c2c66affSColin Finck     hCB = GetDlgItem(hwnd, IDC_DEVICE_REC_LIST);
82c2c66affSColin Finck 
83c2c66affSColin Finck     DevsNum = waveInGetNumDevs();
84c2c66affSColin Finck     if (DevsNum < 1)
85c2c66affSColin Finck     {
86*781c247bSThamatip Chitpong         Res = SendMessageW(hCB, CB_ADDSTRING, 0, (LPARAM)szNoDevices);
87*781c247bSThamatip Chitpong         SendMessageW(hCB, CB_SETCURSEL, (WPARAM)Res, 0);
88c95f3358SStanislav Motylkov         pGlobalData->bNoAudioIn = TRUE;
89c2c66affSColin Finck     }
90c2c66affSColin Finck     else
91c2c66affSColin Finck     {
92c2c66affSColin Finck         WCHAR DefaultDevice[MAX_PATH] = {0};
93c2c66affSColin Finck         HKEY hKey;
94c2c66affSColin Finck         DWORD dwSize = sizeof(DefaultDevice);
95c2c66affSColin Finck         UINT DefaultIndex = 0;
96c2c66affSColin Finck 
97c2c66affSColin Finck         if (RegOpenKeyExW(HKEY_CURRENT_USER, L"Software\\Microsoft\\Multimedia\\Sound Mapper", 0, KEY_READ, &hKey) == ERROR_SUCCESS)
98c2c66affSColin Finck         {
99c2c66affSColin Finck             RegQueryValueExW(hKey, L"Record", NULL, NULL, (LPBYTE)DefaultDevice, &dwSize);
100*781c247bSThamatip Chitpong             DefaultDevice[_countof(DefaultDevice) - 1] = UNICODE_NULL;
101c2c66affSColin Finck             RegCloseKey(hKey);
102c2c66affSColin Finck         }
103c2c66affSColin Finck 
104c2c66affSColin Finck 
105c2c66affSColin Finck         for (uIndex = 0; uIndex < DevsNum; uIndex++)
106c2c66affSColin Finck         {
107*781c247bSThamatip Chitpong             if (waveInGetDevCapsW(uIndex, &waveInputPaps, sizeof(waveInputPaps)))
108c2c66affSColin Finck                 continue;
109c2c66affSColin Finck 
110*781c247bSThamatip Chitpong             Res = SendMessageW(hCB, CB_ADDSTRING, 0, (LPARAM)waveInputPaps.szPname);
111c2c66affSColin Finck 
112c2c66affSColin Finck             if (CB_ERR != Res)
113c2c66affSColin Finck             {
114*781c247bSThamatip Chitpong                 SendMessageW(hCB, CB_SETITEMDATA, Res, (LPARAM)uIndex);
115*781c247bSThamatip Chitpong                 if (!_wcsicmp(waveInputPaps.szPname, DefaultDevice))
116c2c66affSColin Finck                     DefaultIndex = Res;
117c2c66affSColin Finck             }
118c2c66affSColin Finck         }
119*781c247bSThamatip Chitpong         SendMessageW(hCB, CB_SETCURSEL, (WPARAM)DefaultIndex, 0);
120c2c66affSColin Finck     }
121c2c66affSColin Finck 
122c2c66affSColin Finck     // Init MIDI devices list
123c2c66affSColin Finck     hCB = GetDlgItem(hwnd, IDC_DEVICE_MIDI_LIST);
124c2c66affSColin Finck 
125c2c66affSColin Finck     DevsNum = midiOutGetNumDevs();
126c2c66affSColin Finck     if (DevsNum < 1)
127c2c66affSColin Finck     {
128*781c247bSThamatip Chitpong         Res = SendMessageW(hCB, CB_ADDSTRING, 0, (LPARAM)szNoDevices);
129*781c247bSThamatip Chitpong         SendMessageW(hCB, CB_SETCURSEL, (WPARAM)Res, 0);
130c95f3358SStanislav Motylkov         pGlobalData->bNoMIDIOut = TRUE;
131c2c66affSColin Finck     }
132c2c66affSColin Finck     else
133c2c66affSColin Finck     {
134da528a66SStanislav Motylkov         WCHAR DefaultDevice[MAX_PATH] = {0};
135da528a66SStanislav Motylkov         HKEY hKey;
136da528a66SStanislav Motylkov         DWORD dwSize = sizeof(DefaultDevice);
137da528a66SStanislav Motylkov         UINT DefaultIndex = 0;
138da528a66SStanislav Motylkov 
139da528a66SStanislav Motylkov         if (RegOpenKeyExW(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Multimedia\\MIDIMap", 0, KEY_READ, &hKey) == ERROR_SUCCESS)
140da528a66SStanislav Motylkov         {
141da528a66SStanislav Motylkov             RegQueryValueExW(hKey, L"szPname", NULL, NULL, (LPBYTE)DefaultDevice, &dwSize);
142*781c247bSThamatip Chitpong             DefaultDevice[_countof(DefaultDevice) - 1] = UNICODE_NULL;
143da528a66SStanislav Motylkov             RegCloseKey(hKey);
144da528a66SStanislav Motylkov         }
145da528a66SStanislav Motylkov 
146c2c66affSColin Finck         for (uIndex = 0; uIndex < DevsNum; uIndex++)
147c2c66affSColin Finck         {
148*781c247bSThamatip Chitpong             if (midiOutGetDevCapsW(uIndex, &midiOutCaps, sizeof(midiOutCaps)))
149c2c66affSColin Finck                 continue;
150c2c66affSColin Finck 
151*781c247bSThamatip Chitpong             Res = SendMessageW(hCB, CB_ADDSTRING, 0, (LPARAM)midiOutCaps.szPname);
152c2c66affSColin Finck 
153c2c66affSColin Finck             if (CB_ERR != Res)
154c2c66affSColin Finck             {
155*781c247bSThamatip Chitpong                 SendMessageW(hCB, CB_SETITEMDATA, Res, (LPARAM)uIndex);
156*781c247bSThamatip Chitpong                 if (!_wcsicmp(midiOutCaps.szPname, DefaultDevice))
157da528a66SStanislav Motylkov                     DefaultIndex = Res;
158c2c66affSColin Finck             }
159c2c66affSColin Finck         }
160*781c247bSThamatip Chitpong         SendMessageW(hCB, CB_SETCURSEL, (WPARAM)DefaultIndex, 0);
161c2c66affSColin Finck     }
162c2c66affSColin Finck }
163c2c66affSColin Finck 
164c95f3358SStanislav Motylkov VOID
165c95f3358SStanislav Motylkov UpdateRegistryString(HWND hwnd, INT ctrl, LPWSTR key, LPWSTR value)
166c95f3358SStanislav Motylkov {
167c95f3358SStanislav Motylkov     HWND hwndCombo = GetDlgItem(hwnd, ctrl);
168*781c247bSThamatip Chitpong     INT CurSel = SendMessageW(hwndCombo, CB_GETCURSEL, 0, 0);
169c95f3358SStanislav Motylkov     UINT TextLen;
170c95f3358SStanislav Motylkov     WCHAR SelectedDevice[MAX_PATH] = {0};
171c95f3358SStanislav Motylkov     HKEY hKey;
172c95f3358SStanislav Motylkov 
173c95f3358SStanislav Motylkov     if (CurSel == CB_ERR)
174c95f3358SStanislav Motylkov         return;
175c95f3358SStanislav Motylkov 
176c95f3358SStanislav Motylkov     TextLen = SendMessageW(hwndCombo, CB_GETLBTEXTLEN, CurSel, 0) + 1;
177c95f3358SStanislav Motylkov 
178c95f3358SStanislav Motylkov     if (TextLen > _countof(SelectedDevice))
179c95f3358SStanislav Motylkov         return;
180c95f3358SStanislav Motylkov 
181c95f3358SStanislav Motylkov     SendMessageW(hwndCombo, CB_GETLBTEXT, CurSel, (LPARAM)SelectedDevice);
182c95f3358SStanislav Motylkov 
183c95f3358SStanislav Motylkov     if (RegCreateKeyExW(HKEY_CURRENT_USER, key, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL) != ERROR_SUCCESS)
184c95f3358SStanislav Motylkov         return;
185c95f3358SStanislav Motylkov 
186c95f3358SStanislav Motylkov     RegSetValueExW(hKey, value, 0, REG_SZ, (BYTE*)SelectedDevice, (wcslen(SelectedDevice) + 1) * sizeof(WCHAR));
187c95f3358SStanislav Motylkov     RegCloseKey(hKey);
188c95f3358SStanislav Motylkov }
189c95f3358SStanislav Motylkov 
190c95f3358SStanislav Motylkov VOID
191c95f3358SStanislav Motylkov SaveAudioDlg(HWND hwnd, PGLOBAL_DATA pGlobalData)
192c95f3358SStanislav Motylkov {
193c95f3358SStanislav Motylkov     if (pGlobalData->bAudioOutChanged)
194c95f3358SStanislav Motylkov     {
195c95f3358SStanislav Motylkov         UpdateRegistryString(hwnd,
196c95f3358SStanislav Motylkov                              IDC_DEVICE_PLAY_LIST,
197c95f3358SStanislav Motylkov                              L"Software\\Microsoft\\Multimedia\\Sound Mapper",
198c95f3358SStanislav Motylkov                              L"Playback");
199c95f3358SStanislav Motylkov     }
200c95f3358SStanislav Motylkov 
201c95f3358SStanislav Motylkov     if (pGlobalData->bAudioInChanged)
202c95f3358SStanislav Motylkov     {
203c95f3358SStanislav Motylkov         UpdateRegistryString(hwnd,
204c95f3358SStanislav Motylkov                              IDC_DEVICE_REC_LIST,
205c95f3358SStanislav Motylkov                              L"Software\\Microsoft\\Multimedia\\Sound Mapper",
206c95f3358SStanislav Motylkov                              L"Record");
207c95f3358SStanislav Motylkov     }
208c95f3358SStanislav Motylkov 
209c95f3358SStanislav Motylkov     if (pGlobalData->bMIDIOutChanged)
210c95f3358SStanislav Motylkov     {
211c95f3358SStanislav Motylkov         UpdateRegistryString(hwnd,
212c95f3358SStanislav Motylkov                              IDC_DEVICE_MIDI_LIST,
213c95f3358SStanislav Motylkov                              L"Software\\Microsoft\\Windows\\CurrentVersion\\Multimedia\\MIDIMap",
214c95f3358SStanislav Motylkov                              L"szPname");
215c95f3358SStanislav Motylkov     }
216c95f3358SStanislav Motylkov }
217c95f3358SStanislav Motylkov 
218c2c66affSColin Finck static UINT
219c2c66affSColin Finck GetDevNum(HWND hControl, DWORD Id)
220c2c66affSColin Finck {
221c2c66affSColin Finck     int iCurSel;
222c2c66affSColin Finck     UINT DevNum;
223c2c66affSColin Finck 
224*781c247bSThamatip Chitpong     iCurSel = SendMessageW(hControl, CB_GETCURSEL, 0, 0);
225c2c66affSColin Finck 
226c2c66affSColin Finck     if (iCurSel == CB_ERR)
227c2c66affSColin Finck         return 0;
228c2c66affSColin Finck 
229*781c247bSThamatip Chitpong     DevNum = (UINT)SendMessageW(hControl, CB_GETITEMDATA, iCurSel, 0);
230c2c66affSColin Finck     if (DevNum == (UINT) CB_ERR)
231c2c66affSColin Finck         return 0;
232c2c66affSColin Finck 
233c2c66affSColin Finck     if (mixerGetID((HMIXEROBJ)IntToPtr(DevNum), &DevNum, Id) != MMSYSERR_NOERROR)
234c2c66affSColin Finck         return 0;
235c2c66affSColin Finck 
236c2c66affSColin Finck     return DevNum;
237c2c66affSColin Finck }
238c2c66affSColin Finck 
239c2c66affSColin Finck /* Audio property page dialog callback */
240c2c66affSColin Finck INT_PTR CALLBACK
241c2c66affSColin Finck AudioDlgProc(HWND hwndDlg,
242c2c66affSColin Finck              UINT uMsg,
243c2c66affSColin Finck              WPARAM wParam,
244c2c66affSColin Finck              LPARAM lParam)
245c2c66affSColin Finck {
246c95f3358SStanislav Motylkov     PGLOBAL_DATA pGlobalData;
247c95f3358SStanislav Motylkov 
248*781c247bSThamatip Chitpong     pGlobalData = (PGLOBAL_DATA)GetWindowLongPtrW(hwndDlg, DWLP_USER);
249c2c66affSColin Finck 
250c2c66affSColin Finck     switch (uMsg)
251c2c66affSColin Finck     {
252c2c66affSColin Finck         case WM_INITDIALOG:
253c2c66affSColin Finck         {
254c2c66affSColin Finck             UINT NumWavOut = waveOutGetNumDevs();
255c2c66affSColin Finck 
256c95f3358SStanislav Motylkov             pGlobalData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(GLOBAL_DATA));
257*781c247bSThamatip Chitpong             SetWindowLongPtrW(hwndDlg, DWLP_USER, (LONG_PTR)pGlobalData);
258c95f3358SStanislav Motylkov 
259c95f3358SStanislav Motylkov             if (!pGlobalData)
260c95f3358SStanislav Motylkov                 break;
261c95f3358SStanislav Motylkov 
262c95f3358SStanislav Motylkov             InitAudioDlg(hwndDlg, pGlobalData);
263c2c66affSColin Finck 
264c2c66affSColin Finck             if (!NumWavOut)
265c2c66affSColin Finck             {
266c2c66affSColin Finck                 EnableWindow(GetDlgItem(hwndDlg, IDC_DEVICE_PLAY_LIST),     FALSE);
267c2c66affSColin Finck                 EnableWindow(GetDlgItem(hwndDlg, IDC_DEVICE_REC_LIST),      FALSE);
268c2c66affSColin Finck                 EnableWindow(GetDlgItem(hwndDlg, IDC_DEVICE_MIDI_LIST),     FALSE);
269c2c66affSColin Finck                 EnableWindow(GetDlgItem(hwndDlg, IDC_DEFAULT_DEV_CHECKBOX), FALSE);
270c2c66affSColin Finck                 EnableWindow(GetDlgItem(hwndDlg, IDC_VOLUME1_BTN),          FALSE);
271c2c66affSColin Finck                 EnableWindow(GetDlgItem(hwndDlg, IDC_ADV2_BTN),             FALSE);
272c2c66affSColin Finck                 EnableWindow(GetDlgItem(hwndDlg, IDC_VOLUME2_BTN),          FALSE);
273c2c66affSColin Finck                 EnableWindow(GetDlgItem(hwndDlg, IDC_ADV1_BTN),             FALSE);
274c2c66affSColin Finck                 EnableWindow(GetDlgItem(hwndDlg, IDC_VOLUME3_BTN),          FALSE);
275c2c66affSColin Finck                 EnableWindow(GetDlgItem(hwndDlg, IDC_ADV3_BTN),             FALSE);
276c2c66affSColin Finck             }
277c95f3358SStanislav Motylkov 
278c95f3358SStanislav Motylkov             if (pGlobalData->bNoAudioOut)
279c95f3358SStanislav Motylkov             {
280c95f3358SStanislav Motylkov                 EnableWindow(GetDlgItem(hwndDlg, IDC_DEVICE_PLAY_LIST),     FALSE);
281c95f3358SStanislav Motylkov                 EnableWindow(GetDlgItem(hwndDlg, IDC_VOLUME1_BTN),          FALSE);
282c95f3358SStanislav Motylkov                 EnableWindow(GetDlgItem(hwndDlg, IDC_ADV2_BTN),             FALSE);
283c95f3358SStanislav Motylkov             }
284c95f3358SStanislav Motylkov 
285c95f3358SStanislav Motylkov             if (pGlobalData->bNoAudioIn)
286c95f3358SStanislav Motylkov             {
287c95f3358SStanislav Motylkov                 EnableWindow(GetDlgItem(hwndDlg, IDC_DEVICE_REC_LIST),      FALSE);
288c95f3358SStanislav Motylkov                 EnableWindow(GetDlgItem(hwndDlg, IDC_VOLUME2_BTN),          FALSE);
289c95f3358SStanislav Motylkov                 EnableWindow(GetDlgItem(hwndDlg, IDC_ADV1_BTN),             FALSE);
290c95f3358SStanislav Motylkov             }
291c95f3358SStanislav Motylkov 
292c95f3358SStanislav Motylkov             if (pGlobalData->bNoMIDIOut)
293c95f3358SStanislav Motylkov             {
294c95f3358SStanislav Motylkov                 EnableWindow(GetDlgItem(hwndDlg, IDC_DEVICE_MIDI_LIST),     FALSE);
295c95f3358SStanislav Motylkov                 EnableWindow(GetDlgItem(hwndDlg, IDC_VOLUME3_BTN),          FALSE);
296c95f3358SStanislav Motylkov                 EnableWindow(GetDlgItem(hwndDlg, IDC_ADV3_BTN),             FALSE);
297c95f3358SStanislav Motylkov             }
298c2c66affSColin Finck         }
299c2c66affSColin Finck         break;
300c2c66affSColin Finck 
301c2c66affSColin Finck         case WM_COMMAND:
302c2c66affSColin Finck         {
303*781c247bSThamatip Chitpong             STARTUPINFOW si;
304c2c66affSColin Finck             PROCESS_INFORMATION pi;
305c2c66affSColin Finck             WCHAR szPath[MAX_PATH];
306c2c66affSColin Finck 
307c95f3358SStanislav Motylkov             if (!pGlobalData)
308c95f3358SStanislav Motylkov                 break;
309c95f3358SStanislav Motylkov 
310c2c66affSColin Finck             switch (LOWORD(wParam))
311c2c66affSColin Finck             {
312c2c66affSColin Finck                 case IDC_VOLUME1_BTN:
313c2c66affSColin Finck                 {
314*781c247bSThamatip Chitpong                     StringCchPrintfW(szPath, _countof(szPath), L"sndvol32.exe -d %d",
315c2c66affSColin Finck                                      GetDevNum(GetDlgItem(hwndDlg, IDC_DEVICE_PLAY_LIST), MIXER_OBJECTF_WAVEOUT));
316c2c66affSColin Finck 
317c2c66affSColin Finck                     ZeroMemory(&si, sizeof(si));
318c2c66affSColin Finck                     si.cb = sizeof(si);
319c2c66affSColin Finck                     si.dwFlags = STARTF_USESHOWWINDOW;
320c2c66affSColin Finck                     si.wShowWindow = SW_SHOW;
321c2c66affSColin Finck 
322*781c247bSThamatip Chitpong                     if (CreateProcessW(NULL, szPath, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
323*781c247bSThamatip Chitpong                     {
324*781c247bSThamatip Chitpong                         CloseHandle(pi.hProcess);
325*781c247bSThamatip Chitpong                         CloseHandle(pi.hThread);
326*781c247bSThamatip Chitpong                     }
327c2c66affSColin Finck                 }
328c2c66affSColin Finck                 break;
329c2c66affSColin Finck 
330c2c66affSColin Finck                 case IDC_ADV2_BTN:
331c2c66affSColin Finck                 {
332c2c66affSColin Finck 
333c2c66affSColin Finck                 }
334c2c66affSColin Finck                 break;
335c2c66affSColin Finck 
336c2c66affSColin Finck                 case IDC_VOLUME2_BTN:
337c2c66affSColin Finck                 {
338*781c247bSThamatip Chitpong                     StringCchPrintfW(szPath, _countof(szPath), L"sndvol32.exe -r -d %d",
339c2c66affSColin Finck                                      GetDevNum(GetDlgItem(hwndDlg, IDC_DEVICE_REC_LIST), MIXER_OBJECTF_WAVEIN));
340c2c66affSColin Finck 
341c2c66affSColin Finck                     ZeroMemory(&si, sizeof(si));
342c2c66affSColin Finck                     si.cb = sizeof(si);
343c2c66affSColin Finck                     si.dwFlags = STARTF_USESHOWWINDOW;
344c2c66affSColin Finck                     si.wShowWindow = SW_SHOW;
345c2c66affSColin Finck 
346*781c247bSThamatip Chitpong                     if (CreateProcessW(NULL, szPath, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
347*781c247bSThamatip Chitpong                     {
348*781c247bSThamatip Chitpong                         CloseHandle(pi.hProcess);
349*781c247bSThamatip Chitpong                         CloseHandle(pi.hThread);
350*781c247bSThamatip Chitpong                     }
351c2c66affSColin Finck                 }
352c2c66affSColin Finck                 break;
353c2c66affSColin Finck 
354c2c66affSColin Finck                 case IDC_ADV1_BTN:
355c2c66affSColin Finck                 {
356c2c66affSColin Finck 
357c2c66affSColin Finck                 }
358c2c66affSColin Finck                 break;
359c2c66affSColin Finck 
360c2c66affSColin Finck                 case IDC_VOLUME3_BTN:
361c2c66affSColin Finck                 {
362*781c247bSThamatip Chitpong                     StringCchPrintfW(szPath, _countof(szPath), L"sndvol32.exe -d %d",
363c2c66affSColin Finck                                      GetDevNum(GetDlgItem(hwndDlg, IDC_DEVICE_MIDI_LIST), MIXER_OBJECTF_MIDIOUT));
364c2c66affSColin Finck 
365c2c66affSColin Finck                     ZeroMemory(&si, sizeof(si));
366c2c66affSColin Finck                     si.cb = sizeof(si);
367c2c66affSColin Finck                     si.dwFlags = STARTF_USESHOWWINDOW;
368c2c66affSColin Finck                     si.wShowWindow = SW_SHOW;
369c2c66affSColin Finck 
370*781c247bSThamatip Chitpong                     if (CreateProcessW(NULL, szPath, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
371*781c247bSThamatip Chitpong                     {
372*781c247bSThamatip Chitpong                         CloseHandle(pi.hProcess);
373*781c247bSThamatip Chitpong                         CloseHandle(pi.hThread);
374*781c247bSThamatip Chitpong                     }
375c2c66affSColin Finck                 }
376c2c66affSColin Finck                 break;
377c2c66affSColin Finck 
378c2c66affSColin Finck                 case IDC_ADV3_BTN:
379c2c66affSColin Finck                 {
380c2c66affSColin Finck 
381c2c66affSColin Finck                 }
382c2c66affSColin Finck                 break;
383c95f3358SStanislav Motylkov 
384c95f3358SStanislav Motylkov                 case IDC_DEVICE_PLAY_LIST:
385c95f3358SStanislav Motylkov                 {
386c95f3358SStanislav Motylkov                     if (HIWORD(wParam) == CBN_SELCHANGE)
387c95f3358SStanislav Motylkov                     {
388c95f3358SStanislav Motylkov                         PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
389c95f3358SStanislav Motylkov                         pGlobalData->bAudioOutChanged = TRUE;
390c2c66affSColin Finck                     }
391c2c66affSColin Finck                 }
392c2c66affSColin Finck                 break;
393c95f3358SStanislav Motylkov 
394c95f3358SStanislav Motylkov                 case IDC_DEVICE_REC_LIST:
395c95f3358SStanislav Motylkov                 {
396c95f3358SStanislav Motylkov                     if (HIWORD(wParam) == CBN_SELCHANGE)
397c95f3358SStanislav Motylkov                     {
398c95f3358SStanislav Motylkov                         PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
399c95f3358SStanislav Motylkov                         pGlobalData->bAudioInChanged = TRUE;
400c95f3358SStanislav Motylkov                     }
401c95f3358SStanislav Motylkov                 }
402c95f3358SStanislav Motylkov 
403c95f3358SStanislav Motylkov                 case IDC_DEVICE_MIDI_LIST:
404c95f3358SStanislav Motylkov                 {
405c95f3358SStanislav Motylkov                     if (HIWORD(wParam) == CBN_SELCHANGE)
406c95f3358SStanislav Motylkov                     {
407c95f3358SStanislav Motylkov                         PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
408c95f3358SStanislav Motylkov                         pGlobalData->bMIDIOutChanged = TRUE;
409c95f3358SStanislav Motylkov                     }
410c95f3358SStanislav Motylkov                 }
411c95f3358SStanislav Motylkov                 break;
412c95f3358SStanislav Motylkov             }
413c95f3358SStanislav Motylkov         }
414c95f3358SStanislav Motylkov         break;
415c95f3358SStanislav Motylkov 
416c95f3358SStanislav Motylkov         case WM_DESTROY:
417c95f3358SStanislav Motylkov             if (!pGlobalData)
418c95f3358SStanislav Motylkov                 break;
419c95f3358SStanislav Motylkov 
420c95f3358SStanislav Motylkov             HeapFree(GetProcessHeap(), 0, pGlobalData);
421c95f3358SStanislav Motylkov             break;
422c95f3358SStanislav Motylkov 
423c95f3358SStanislav Motylkov         case WM_NOTIFY:
424c95f3358SStanislav Motylkov             if (!pGlobalData)
425c95f3358SStanislav Motylkov                 break;
426c95f3358SStanislav Motylkov 
427c95f3358SStanislav Motylkov             if (((LPNMHDR)lParam)->code == (UINT)PSN_APPLY)
428c95f3358SStanislav Motylkov             {
429c95f3358SStanislav Motylkov                 SaveAudioDlg(hwndDlg, pGlobalData);
430c95f3358SStanislav Motylkov             }
431c95f3358SStanislav Motylkov             return TRUE;
432c2c66affSColin Finck     }
433c2c66affSColin Finck 
434c2c66affSColin Finck     return FALSE;
435c2c66affSColin Finck }
436