ReactOS  0.4.12-dev-721-g03c3dd5
sndvol32.c
Go to the documentation of this file.
1 /*
2  * ReactOS Sound Volume Control
3  * Copyright (C) 2004-2005 Thomas Weidenmueller
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18  */
19 /*
20  * COPYRIGHT: See COPYING in the top level directory
21  * PROJECT: ReactOS Sound Volume Control
22  * FILE: base/applications/sndvol32/sndvol32.c
23  * PROGRAMMERS: Thomas Weidenmueller <w3seek@reactos.com>
24  */
25 
26 #include "sndvol32.h"
27 
28 #include <shellapi.h>
29 
36 
37 #define GetDialogData(hwndDlg, type) \
38  ( P##type )GetWindowLongPtr((hwndDlg), DWLP_USER)
39 #define GetWindowData(hwnd, type) \
40  ( P##type )GetWindowLongPtr((hwnd), GWL_USERDATA)
41 
42 /******************************************************************************/
43 
44 
45 
47 {
52 
53 static BOOL CALLBACK
55  UINT Id,
56  LPCTSTR ProductName,
57  PVOID Context)
58 {
59  LRESULT lres;
61 
63 
64  lres = SendMessage(FillContext->hComboBox,
66  0,
67  (LPARAM)ProductName);
68  if (lres != CB_ERR)
69  {
70  /* save the index so we don't screw stuff when the combobox is sorted... */
71  SendMessage(FillContext->hComboBox,
73  (WPARAM)lres,
74  Id);
75 
76  if (Id == FillContext->Selected)
77  {
78  SendMessage(FillContext->hComboBox,
80  (WPARAM)lres,
81  0);
82  }
83  }
84 
85  return TRUE;
86 }
87 
88 static BOOL CALLBACK
91  UINT DisplayControls,
92  PVOID Context)
93 {
95 
97  UNREFERENCED_PARAMETER(DisplayControls);
98 
99  switch (Line->dwComponentType)
100  {
102  if (PrefContext->PlaybackID == (DWORD)-1)
103  {
104  PrefContext->PlaybackID = Line->dwLineID;
105 
106  if (PrefContext->SelectedLine == (DWORD)-1)
107  {
108  PrefContext->SelectedLine = Line->dwLineID;
109  }
110  }
111  else
112  goto AddToOthersLines;
113 
114  break;
115 
117  if (PrefContext->RecordingID == (DWORD)-1)
118  {
119  PrefContext->RecordingID = Line->dwLineID;
120 
121  if (PrefContext->SelectedLine == (DWORD)-1)
122  {
123  PrefContext->SelectedLine = Line->dwLineID;
124  }
125  }
126  else
127  goto AddToOthersLines;
128 
129  break;
130 
131  default:
132  {
133  LRESULT lres;
134  HWND hwndCbOthers;
135 
136  if (PrefContext->SelectedLine == (DWORD)-1)
137  {
138  PrefContext->SelectedLine = Line->dwLineID;
139  }
140 
141 AddToOthersLines:
142  hwndCbOthers = GetDlgItem(PrefContext->hwndDlg,
143  IDC_LINE);
144 
145  lres = SendMessage(hwndCbOthers,
146  CB_ADDSTRING,
147  0,
148  (LPARAM)Line->szName);
149  if (lres != CB_ERR)
150  {
151  SendMessage(hwndCbOthers,
153  (WPARAM)lres,
154  Line->dwLineID);
155 
156  PrefContext->OtherLines++;
157  }
158  break;
159  }
160  }
161 
162  return TRUE;
163 }
164 
165 static BOOL CALLBACK
167  DWORD LineID,
169  PVOID Context)
170 {
172  HWND hwndControls;
173  LVITEM lvi;
174  UINT i;
175 
176  UNREFERENCED_PARAMETER(Mixer);
177  UNREFERENCED_PARAMETER(LineID);
178 
179  if (Line->cControls != 0)
180  {
181  hwndControls = GetDlgItem(PrefContext->hwndDlg,
182  IDC_CONTROLS);
183 
184  lvi.mask = LVIF_TEXT | LVIF_PARAM;
185  lvi.iItem = PrefContext->tmp++;
186  lvi.iSubItem = 0;
187  lvi.pszText = Line->szName;
188  lvi.lParam = (LPARAM)Line->dwSource;
189 
190  i = SendMessage(hwndControls,
192  0,
193  (LPARAM)&lvi);
194  if (i != (UINT)-1)
195  {
196  TCHAR LineName[MIXER_LONG_NAME_CHARS];
197  DWORD Flags;
198  BOOL SelLine = FALSE;
199 
200  if (SndMixerGetLineName(PrefContext->Mixer,
201  PrefContext->SelectedLine,
202  LineName,
204  TRUE) == -1)
205  {
206  LineName[0] = TEXT('\0');
207  }
208 
209  if (ReadLineConfig(PrefContext->DeviceName,
210  LineName,
211  Line->szName,
212  &Flags))
213  {
214  if (Flags != 0x4)
215  {
216  SelLine = TRUE;
217  }
218  }
219 
220  ListView_SetCheckState(hwndControls,
221  i,
222  SelLine);
223  }
224  }
225 
226  return TRUE;
227 }
228 
229 static VOID
231  DWORD LineID)
232 {
233  INT OldID, MixerID = 0;
234  INT DeviceCbIndex;
235 
236  /* select the mixer */
237  DeviceCbIndex = SendDlgItemMessage(Context->hwndDlg,
239  CB_GETCURSEL,
240  0,
241  0);
242  if (DeviceCbIndex != CB_ERR)
243  {
244  MixerID = SendDlgItemMessage(Context->hwndDlg,
247  DeviceCbIndex,
248  0);
249  if (MixerID == CB_ERR)
250  {
251  MixerID = 0;
252  }
253  }
254 
255  OldID = Context->Selected;
256  if (MixerID != OldID &&
257  SndMixerSelect(Context->Mixer,
258  MixerID))
259  {
260  Context->Selected = SndMixerGetSelection(Context->Mixer);
261 
262  /* update the controls */
263  Context->PlaybackID = (DWORD)-1;
264  Context->RecordingID = (DWORD)-1;
265  Context->OtherLines = 0;
266  Context->SelectedLine = (DWORD)-1;
267 
269  Context->DeviceName,
270  sizeof(Context->DeviceName) / sizeof(Context->DeviceName[0]));
271 
272  if (SndMixerEnumLines(Context->Mixer,
274  Context))
275  {
276  UINT SelBox = 0;
277 
278  /* enable/disable controls and make default selection */
280  IDC_PLAYBACK),
281  Context->PlaybackID != (DWORD)-1);
282  CheckDlgButton(Context->hwndDlg,
283  IDC_PLAYBACK,
284  (Context->PlaybackID != (DWORD)-1 && SelBox++ == 0) ?
286 
288  IDC_RECORDING),
289  Context->RecordingID != (DWORD)-1);
290  CheckDlgButton(Context->hwndDlg,
292  (Context->RecordingID != (DWORD)-1 && SelBox++ == 0) ?
294 
295  if (Context->OtherLines != 0)
296  {
297  /* select the first item in the other lines combo box by default */
298  SendDlgItemMessage(Context->hwndDlg,
299  IDC_LINE,
300  CB_SETCURSEL,
301  0,
302  0);
303  }
305  IDC_LINE),
306  FALSE);
308  IDC_OTHER),
309  Context->OtherLines != 0);
310  CheckDlgButton(Context->hwndDlg,
311  IDC_LINE,
312  (Context->OtherLines != 0 && SelBox++ == 0) ?
314 
315  /* disable the OK button if the device doesn't have any lines */
317  IDOK),
318  Context->PlaybackID != (DWORD)-1 ||
319  Context->RecordingID != (DWORD)-1 ||
320  Context->OtherLines != 0);
321 
322  LineID = Context->SelectedLine;
323  }
324  }
325 
326  /* update the line sources list */
327  if ((MixerID != OldID && Context->SelectedLine != (DWORD)-1) ||
328  (Context->SelectedLine != LineID && LineID != (DWORD)-1))
329  {
330  Context->SelectedLine = LineID;
331 
333  IDC_CONTROLS));
334 
335  Context->tmp = 0;
337  LineID,
339  Context);
340  }
341 }
342 
343 static
344 VOID
346 {
347  HWND hwndControls;
348  INT Count, Index;
349  WCHAR LineName[MIXER_LONG_NAME_CHARS];
350  WCHAR DestinationName[MIXER_LONG_NAME_CHARS];
351  DWORD Flags;
352  PSNDVOL_REG_LINESTATE LineStates;
353 
354  /* get list view */
355  hwndControls = GetDlgItem(hwndDlg, IDC_CONTROLS);
356 
357  /* get list item count */
358  Count = ListView_GetItemCount(hwndControls);
359 
360  /* sanity check */
361  assert(Count);
362 
363  if (SndMixerGetLineName(Context->Mixer, Context->SelectedLine, DestinationName, MIXER_LONG_NAME_CHARS, TRUE) == -1)
364  {
365  /* failed to get destination line name */
366  return;
367  }
368 
369  /* allocate line states array */
371  if (LineStates == NULL)
372  {
373  /* failed to allocate line states array */
374  return;
375  }
376 
377 
378  for(Index = 0; Index < Count; Index++)
379  {
380  /* set to empty */
381  LineName[0] = L'\0';
382 
383  /* get item text */
384  ListView_GetItemText(hwndControls, Index, 0, LineName, MIXER_LONG_NAME_CHARS);
385 
386  /* make sure it is null terminated */
387  LineName[MIXER_LONG_NAME_CHARS-1] = L'\0';
388 
389  /* get check state */
390  Flags = (ListView_GetCheckState(hwndControls, Index) == 0 ? 0x4 : 0);
391 
392  /* copy line name */
393  wcscpy(LineStates[Index].LineName, LineName);
394 
395  /* store flags */
396  LineStates[Index].Flags = Flags;
397  }
398 
399  /* now write the line config */
400  WriteLineConfig(Context->DeviceName, DestinationName, LineStates, sizeof(SNDVOL_REG_LINESTATE) * Count);
401 
402  /* free line states */
403  HeapFree(GetProcessHeap(), 0, LineStates);
404 }
405 
406 static INT_PTR CALLBACK
408  UINT uMsg,
409  WPARAM wParam,
410  LPARAM lParam)
411 {
413 
414  switch (uMsg)
415  {
416  case WM_COMMAND:
417  {
418  Context = GetDialogData(hwndDlg,
420  switch (LOWORD(wParam))
421  {
422  case IDC_MIXERDEVICE:
423  {
424  if (HIWORD(wParam) == CBN_SELCHANGE)
425  {
427  (DWORD)-1);
428  }
429  break;
430  }
431 
432  case IDC_LINE:
433  {
434  if (HIWORD(wParam) == CBN_SELCHANGE)
435  {
436  INT LineID;
437  INT Index;
438 
439  Index = SendDlgItemMessage(hwndDlg,
440  IDC_LINE,
441  CB_GETCURSEL,
442  0,
443  0);
444  if (Index != CB_ERR)
445  {
446  LineID = SendDlgItemMessage(hwndDlg,
447  IDC_LINE,
449  Index,
450  0);
451  if (LineID != CB_ERR)
452  {
454  LineID);
455  }
456  }
457  }
458  break;
459  }
460 
461  case IDC_PLAYBACK:
462  {
464  Context->PlaybackID);
465  EnableWindow(GetDlgItem(hwndDlg,
466  IDC_LINE),
467  FALSE);
468  break;
469  }
470 
471  case IDC_RECORDING:
472  {
474  Context->RecordingID);
475  EnableWindow(GetDlgItem(hwndDlg,
476  IDC_LINE),
477  FALSE);
478  break;
479  }
480 
481  case IDC_OTHER:
482  {
483  INT LineCbIndex;
484  INT LineID;
485 
486  EnableWindow(GetDlgItem(hwndDlg,
487  IDC_LINE),
488  TRUE);
489 
490  LineCbIndex = SendDlgItemMessage(hwndDlg,
491  IDC_LINE,
492  CB_GETCURSEL,
493  0,
494  0);
495  if (LineCbIndex != CB_ERR)
496  {
497  LineID = SendDlgItemMessage(hwndDlg,
498  IDC_LINE,
500  LineCbIndex,
501  0);
502  if (LineID != CB_ERR)
503  {
505  LineID);
506  }
507  }
508  break;
509  }
510 
511  case IDOK:
512  {
513  /* write line settings */
514  WriteLineSettings(Context, hwndDlg);
515 
516  /* fall through */
517  }
518  case IDCANCEL:
519  {
520  EndDialog(hwndDlg,
521  LOWORD(wParam));
522  break;
523  }
524  }
525  break;
526  }
527 
528  case WM_INITDIALOG:
529  {
530  PREFERENCES_FILL_DEVICES FillDevContext;
531  LVCOLUMN lvc;
532  RECT rcClient;
533  HWND hwndControls;
534 
535  SetWindowLongPtr(hwndDlg,
536  DWLP_USER,
537  (LONG_PTR)lParam);
539  Context->hwndDlg = hwndDlg;
540  Context->Mixer = SndMixerCreate(hwndDlg, Context->MixerWindow->MixerId);
541  Context->Selected = (UINT)-1;
542 
543  FillDevContext.PrefContext = Context;
544  FillDevContext.hComboBox = GetDlgItem(hwndDlg,
546  FillDevContext.Selected = SndMixerGetSelection(Context->Mixer);
549  &FillDevContext);
550 
551  /* initialize the list view control */
552  hwndControls = GetDlgItem(hwndDlg,
553  IDC_CONTROLS);
556 
557  GetClientRect(hwndControls,
558  &rcClient);
559  lvc.mask = LVCF_TEXT | LVCF_WIDTH;
560  lvc.pszText = TEXT("");
561  lvc.cx = rcClient.right;
562  SendMessage(hwndControls,
564  0,
565  (LPARAM)&lvc);
566 
567  /* update all controls */
569  (DWORD)Context->SelectedLine);
570  return TRUE;
571  }
572 
573  case WM_CLOSE:
574  {
575  EndDialog(hwndDlg,
576  IDCANCEL);
577  break;
578  }
579 
580  case WM_SYSCOLORCHANGE:
581  {
582  HWND hwndControls;
583 
584  /* Forward WM_SYSCOLORCHANGE */
585  hwndControls = GetDlgItem(hwndDlg, IDC_CONTROLS);
586  SendMessage(hwndControls, WM_SYSCOLORCHANGE, 0, 0);
587  break;
588  }
589  }
590 
591  return 0;
592 }
593 
594 /******************************************************************************/
595 
596 static VOID
598 {
599  DWORD Index;
600 
601  for(Index = 0; Index < MixerWindow->WindowCount; Index++)
602  {
603  /* destroys the window */
604  DestroyWindow(MixerWindow->Window[Index]);
605  }
606 
607  /* free memory */
608  HeapFree(GetProcessHeap(), 0, MixerWindow->Window);
609 
610  /* set to null */
611  MixerWindow->Window = NULL;
612  MixerWindow->WindowCount = 0;
613 }
614 
615 static BOOL
617 {
618  /* delete existing mixer controls */
620 
621  /* load new mixer controls */
622  LoadDialogCtrls(PrefContext);
623 
624  return TRUE;
625 }
626 
627 static
628 BOOL
629 CALLBACK
631 {
632  UINT ControlCount = 0, Index;
637 
638  /* check if the line name is equal */
639  if (wcsicmp(Line->szName, Context->LineName))
640  {
641  /* it is not */
642  return TRUE;
643  }
644 
645  /* query controls */
646  if (SndMixerQueryControls(Mixer, &ControlCount, Line, &Control) == FALSE)
647  {
648  /* failed to query for controls */
649  return FALSE;
650  }
651 
652  puDetails = HeapAlloc(GetProcessHeap(), 0, Line->cChannels * sizeof(MIXERCONTROLDETAILS_UNSIGNED));
653  if (puDetails == NULL)
654  return FALSE;
655 
656  /* now go through all controls and compare control ids */
657  for (Index = 0; Index < ControlCount; Index++)
658  {
659  if (Context->bVertical)
660  {
662  {
663  DWORD LineOffset, volumePosition, balancePosition;
664  DWORD volumeStep, balanceStep;
665 
666  LineOffset = Context->SliderPos;
667 
668  volumePosition = (DWORD)SendDlgItemMessage(Preferences.MixerWindow->hWnd, LineOffset * IDC_LINE_SLIDER_VERT, TBM_GETPOS, 0, 0);
669  volumeStep = (Control[Index].Bounds.dwMaximum - Control[Index].Bounds.dwMinimum) / (VOLUME_MAX - VOLUME_MIN);
670 
671  if (Line->cChannels == 1)
672  {
673  /* set up details */
674  puDetails[0].dwValue = ((VOLUME_MAX - volumePosition) * volumeStep) + Control[Index].Bounds.dwMinimum;
675  }
676  else if (Line->cChannels == 2)
677  {
678  balancePosition = (DWORD)SendDlgItemMessage(Preferences.MixerWindow->hWnd, LineOffset * IDC_LINE_SLIDER_HORZ, TBM_GETPOS, 0, 0);
679  if (balancePosition == BALANCE_CENTER)
680  {
681  puDetails[0].dwValue = ((VOLUME_MAX - volumePosition) * volumeStep) + Control[Index].Bounds.dwMinimum;
682  puDetails[1].dwValue = ((VOLUME_MAX - volumePosition) * volumeStep) + Control[Index].Bounds.dwMinimum;
683  }
684  else if (balancePosition == BALANCE_LEFT)
685  {
686  puDetails[0].dwValue = ((VOLUME_MAX - volumePosition) * volumeStep) + Control[Index].Bounds.dwMinimum;
687  puDetails[1].dwValue = Control[Index].Bounds.dwMinimum;
688  }
689  else if (balancePosition == BALANCE_RIGHT)
690  {
691  puDetails[0].dwValue = Control[Index].Bounds.dwMinimum;
692  puDetails[1].dwValue = ((VOLUME_MAX - volumePosition) * volumeStep) + Control[Index].Bounds.dwMinimum;
693  }
694  else if (balancePosition < BALANCE_CENTER) // Left
695  {
696  puDetails[0].dwValue = ((VOLUME_MAX - volumePosition) * volumeStep) + Control[Index].Bounds.dwMinimum;
697 
698  balanceStep = (puDetails[0].dwValue - Control[Index].Bounds.dwMinimum) / (BALANCE_STEPS / 2);
699 
700  puDetails[1].dwValue = (balancePosition * balanceStep) + Control[Index].Bounds.dwMinimum;
701  }
702  else if (balancePosition > BALANCE_CENTER) // Right
703  {
704  puDetails[1].dwValue = ((VOLUME_MAX - volumePosition) * volumeStep) + Control[Index].Bounds.dwMinimum;
705 
706  balanceStep = (puDetails[1].dwValue - Control[Index].Bounds.dwMinimum) / (BALANCE_STEPS / 2);
707 
708  puDetails[0].dwValue = ((BALANCE_RIGHT - balancePosition) * balanceStep) + Control[Index].Bounds.dwMinimum;
709  }
710  }
711  else
712  {
714 
715  /* FIXME */
716  }
717 
718  /* set volume */
720 
721  /* done */
722  break;
723  }
724  }
725  else if (Context->bSwitch)
726  {
728  {
729  /* set up details */
730  bDetails.fValue = Context->SliderPos;
731 
732  /* set volume */
734 
735  /* done */
736  break;
737  }
738  }
739  }
740 
741  if (puDetails != NULL)
742  HeapFree(GetProcessHeap(), 0, puDetails);
743 
744  /* free controls */
746 
747 
748  /* done */
749  return TRUE;
750 }
751 
752 static
753 BOOL
754 CALLBACK
756 {
757  PMIXERCONTROLDETAILS_UNSIGNED pVolumeDetails = NULL;
758  UINT ControlCount = 0, Index;
760 
761  /* check if the line has controls */
762  if (Line->cControls == 0)
763  {
764  /* no controls */
765  return TRUE;
766  }
767 
768  /* query controls */
769  if (SndMixerQueryControls(Mixer, &ControlCount, Line, &Control) == FALSE)
770  {
771  /* failed to query for controls */
772  return FALSE;
773  }
774 
775  pVolumeDetails = HeapAlloc(GetProcessHeap(),
776  0,
777  Line->cChannels * sizeof(MIXERCONTROLDETAILS_UNSIGNED));
778  if (pVolumeDetails == NULL)
779  goto done;
780 
781  /* now go through all controls and compare control ids */
782  for (Index = 0; Index < ControlCount; Index++)
783  {
784  if (Control[Index].dwControlID == PtrToUlong(Context))
785  {
787  {
789 
790  /* get volume control details */
792  {
793  /* update dialog control */
795  }
796  }
798  {
799  /* get volume control details */
800  if (SndMixerGetVolumeControlDetails(Preferences.MixerWindow->Mixer, Control[Index].dwControlID, Line->cChannels, sizeof(MIXERCONTROLDETAILS_UNSIGNED), (LPVOID)pVolumeDetails) != -1)
801  {
802  /* update dialog control */
803  DWORD volumePosition, volumeStep, maxVolume, i;
804  DWORD balancePosition, balanceStep;
805 
806  volumeStep = (Control[Index].Bounds.dwMaximum - Control[Index].Bounds.dwMinimum) / (VOLUME_MAX - VOLUME_MIN);
807 
808  maxVolume = 0;
809  for (i = 0; i < Line->cChannels; i++)
810  {
811  if (pVolumeDetails[i].dwValue > maxVolume)
812  maxVolume = pVolumeDetails[i].dwValue;
813  }
814 
815  volumePosition = (maxVolume - Control[Index].Bounds.dwMinimum) / volumeStep;
816 
817  if (Line->cChannels == 1)
818  {
819  balancePosition = BALANCE_CENTER;
820  }
821  else if (Line->cChannels == 2)
822  {
823  if (pVolumeDetails[0].dwValue == pVolumeDetails[1].dwValue)
824  {
825  balancePosition = BALANCE_CENTER;
826  }
827  else if (pVolumeDetails[0].dwValue == Control[Index].Bounds.dwMinimum)
828  {
829  balancePosition = BALANCE_RIGHT;
830  }
831  else if (pVolumeDetails[1].dwValue == Control[Index].Bounds.dwMinimum)
832  {
833  balancePosition = BALANCE_LEFT;
834  }
835  else
836  {
837  balanceStep = (maxVolume - Control[Index].Bounds.dwMinimum) / (BALANCE_STEPS / 2);
838 
839  if (pVolumeDetails[0].dwValue < pVolumeDetails[1].dwValue)
840  {
841  balancePosition = (pVolumeDetails[0].dwValue - Control[Index].Bounds.dwMinimum) / balanceStep;
842  balancePosition = BALANCE_RIGHT - balancePosition;
843  }
844  else if (pVolumeDetails[1].dwValue < pVolumeDetails[0].dwValue)
845  {
846  balancePosition = (pVolumeDetails[1].dwValue - Control[Index].Bounds.dwMinimum) / balanceStep;
847  balancePosition = BALANCE_LEFT + balancePosition;
848  }
849  }
850  }
851 
852  /* Update the volume control slider */
854 
855  /* Update the balance control slider */
857  }
858  }
859  break;
860  }
861  }
862 
863 done:
864  /* Free the volume details */
865  if (pVolumeDetails)
866  HeapFree(GetProcessHeap(), 0, pVolumeDetails);
867 
868  /* free controls */
870 
871  /* done */
872  return TRUE;
873 }
874 
875 static LRESULT CALLBACK
877  UINT uMsg,
878  WPARAM wParam,
879  LPARAM lParam)
880 {
881  PMIXER_WINDOW MixerWindow;
882  DWORD CtrlID, LineOffset;
883  LRESULT Result = 0;
885 
886  switch (uMsg)
887  {
888  case WM_COMMAND:
889  {
890  MixerWindow = GetWindowData(hwnd,
891  MIXER_WINDOW);
892 
893  switch (LOWORD(wParam))
894  {
895  case IDM_PROPERTIES:
896  {
897  PREFERENCES_CONTEXT Pref;
898 
899  Pref.MixerWindow = MixerWindow;
900  Pref.Mixer = NULL;
902 
905  hwnd,
907  (LPARAM)&Pref) == IDOK)
908  {
909  /* update window */
910  TCHAR szProduct[MAXPNAMELEN];
911 
912  /* get mixer product name */
913  if (SndMixerGetProductName(Pref.Mixer,
914  szProduct,
915  sizeof(szProduct) / sizeof(szProduct[0])) == -1)
916  {
917  /* failed to get name */
918  szProduct[0] = L'\0';
919  }
920  else
921  {
922  /* copy product */
923  wcscpy(Preferences.DeviceName, szProduct);
924  }
925 
926  /* destroy old status bar */
927  if (MixerWindow->Mode == NORMAL_MODE)
928  DestroyWindow(MixerWindow->hStatusBar);
929 
930  /* update details */
931  Preferences.SelectedLine = Pref.SelectedLine;
932 
933  /* destroy old mixer */
935 
936  /* use new selected mixer */
937  Preferences.MixerWindow->Mixer = Pref.Mixer;
938 
939  /* create status window */
940  if (MixerWindow->Mode == NORMAL_MODE)
941  {
943  NULL,
944  hwnd,
945  0);
946  if (MixerWindow->hStatusBar)
947  {
948  /* Set status bar */
949  SendMessage(MixerWindow->hStatusBar,
950  WM_SETTEXT,
951  0,
952  (LPARAM)szProduct);
953  }
954  }
955 
956  /* rebuild dialog controls */
958  }
959  break;
960  }
961 
963  MixerWindow->bShowExtendedControls = !MixerWindow->bShowExtendedControls;
968  break;
969 
970  case IDM_EXIT:
971  {
972  PostQuitMessage(0);
973  break;
974  }
975 
976  case IDM_ABOUT:
977  {
978  HICON hAppIcon = (HICON)GetClassLongPtrW(hwnd,
979  GCLP_HICON);
981  lpAppTitle,
982  NULL,
983  hAppIcon);
984  break;
985  }
986 
987  default:
988  {
989  /* get button id */
990  CtrlID = LOWORD(wParam);
991 
992  /* check if the message is from the line switch */
993  if (HIWORD(wParam) == BN_CLICKED)
994  {
995  if (CtrlID % IDC_LINE_SWITCH == 0)
996  {
997  /* compute line offset */
998  LineOffset = CtrlID / IDC_LINE_SWITCH;
999 
1000  /* compute window id of line name static control */
1001  CtrlID = LineOffset * IDC_LINE_NAME;
1002 
1003  /* get line name */
1004  if (GetDlgItemTextW(hwnd, CtrlID, Context.LineName, MIXER_LONG_NAME_CHARS) != 0)
1005  {
1006  /* setup context */
1007  Context.SliderPos = SendMessage((HWND)lParam, BM_GETCHECK, 0, 0);
1008  Context.bVertical = FALSE;
1009  Context.bSwitch = TRUE;
1010 
1011  /* set volume */
1013  }
1014  }
1015  else if (CtrlID % IDC_LINE_ADVANCED == 0)
1016  {
1017  ADVANCED_CONTEXT AdvancedContext;
1018 
1019  /* compute line offset */
1020  LineOffset = CtrlID / IDC_LINE_ADVANCED;
1021 
1022  /* compute window id of line name static control */
1023  CtrlID = LineOffset * IDC_LINE_NAME;
1024 
1025  /* get line name */
1026  if (GetDlgItemTextW(hwnd, CtrlID, AdvancedContext.LineName, MIXER_LONG_NAME_CHARS) != 0)
1027  {
1028  AdvancedContext.Mixer = Preferences.MixerWindow->Mixer;
1031  AdvancedContext.LineName);
1032  if (AdvancedContext.Line)
1033  {
1036  hwnd,
1038  (LPARAM)&AdvancedContext);
1039  }
1040  }
1041  }
1042  }
1043  }
1044  }
1045  break;
1046  }
1047 
1048  case MM_MIXM_LINE_CHANGE:
1049  {
1050  DPRINT("MM_MIXM_LINE_CHANGE\n");
1051  break;
1052  }
1053 
1055  {
1056  DPRINT("MM_MIXM_CONTROL_CHANGE\n");
1057 
1058  /* get mixer window */
1059  MixerWindow = GetWindowData(hwnd,
1060  MIXER_WINDOW);
1061 
1062  /* sanity checks */
1063  assert(MixerWindow);
1064  assert(MixerWindow->Mixer->hmx == (HMIXER)wParam);
1065 
1067  break;
1068  }
1069 
1070  case WM_VSCROLL:
1071  switch (LOWORD(wParam))
1072  {
1073  case TB_THUMBTRACK:
1074  /* get dialog item ctrl */
1075  CtrlID = GetDlgCtrlID((HWND)lParam);
1076 
1077  /* get line index */
1078  LineOffset = CtrlID / IDC_LINE_SLIDER_VERT;
1079 
1080  /* compute window id of line name static control */
1081  CtrlID = LineOffset * IDC_LINE_NAME;
1082 
1083  /* get line name */
1084  if (GetDlgItemTextW(hwnd, CtrlID, Context.LineName, MIXER_LONG_NAME_CHARS) != 0)
1085  {
1086  /* setup context */
1087  Context.SliderPos = LineOffset;
1088  Context.bVertical = TRUE;
1089  Context.bSwitch = FALSE;
1090 
1091  /* set volume */
1093  }
1094  break;
1095 
1096  case TB_ENDTRACK:
1097  MixerWindow = GetWindowData(hwnd,
1098  MIXER_WINDOW);
1099 
1100  /* get dialog item ctrl */
1101  CtrlID = GetDlgCtrlID((HWND)lParam);
1102 
1103  /* get line index */
1104  LineOffset = CtrlID / IDC_LINE_SLIDER_VERT;
1105 
1106  if (LineOffset == 1 && MixerWindow->Mixer->MixerId == 0)
1108  break;
1109 
1110  default:
1111  break;
1112  }
1113  break;
1114 
1115  case WM_HSCROLL:
1116  switch (LOWORD(wParam))
1117  {
1118  case TB_THUMBTRACK:
1119  /* get dialog item ctrl */
1120  CtrlID = GetDlgCtrlID((HWND)lParam);
1121 
1122  /* get line index */
1123  LineOffset = CtrlID / IDC_LINE_SLIDER_HORZ;
1124 
1125  /* compute window id of line name static control */
1126  CtrlID = LineOffset * IDC_LINE_NAME;
1127 
1128  /* get line name */
1129  if (GetDlgItemTextW(hwnd, CtrlID, Context.LineName, MIXER_LONG_NAME_CHARS) != 0)
1130  {
1131  /* setup context */
1132  Context.SliderPos = LineOffset;
1133  Context.bVertical = TRUE;
1134  Context.bSwitch = FALSE;
1135 
1136  /* set volume */
1138  }
1139  break;
1140 
1141  case TB_ENDTRACK:
1142  MixerWindow = GetWindowData(hwnd,
1143  MIXER_WINDOW);
1144 
1145  /* get dialog item ctrl */
1146  CtrlID = GetDlgCtrlID((HWND)lParam);
1147 
1148  /* get line index */
1149  LineOffset = CtrlID / IDC_LINE_SLIDER_HORZ;
1150 
1151  if (LineOffset == 1 && MixerWindow->Mixer->MixerId == 0)
1153  break;
1154 
1155  default:
1156  break;
1157  }
1158  break;
1159 
1160 
1161  case WM_CREATE:
1162  {
1163  MixerWindow = ((LPCREATESTRUCT)lParam)->lpCreateParams;
1165  GWL_USERDATA,
1166  (LONG_PTR)MixerWindow);
1167  MixerWindow->hWnd = hwnd;
1168  MixerWindow->Mixer = SndMixerCreate(MixerWindow->hWnd, MixerWindow->MixerId);
1169  if (MixerWindow->Mixer != NULL)
1170  {
1171  TCHAR szProduct[MAXPNAMELEN];
1172 
1173  /* get mixer product name */
1174  if (SndMixerGetProductName(MixerWindow->Mixer,
1175  szProduct,
1176  sizeof(szProduct) / sizeof(szProduct[0])) == -1)
1177  {
1178  /* failed to get name */
1179  szProduct[0] = L'\0';
1180  }
1181 
1182 
1183  /* initialize preferences */
1184  ZeroMemory(&Preferences, sizeof(Preferences));
1185 
1186  /* store mixer */
1187  Preferences.Mixer = MixerWindow->Mixer;
1188 
1189  /* store mixer window */
1190  Preferences.MixerWindow = MixerWindow;
1191 
1192  /* first destination line id */
1193  Preferences.SelectedLine = 0xFFFF0000;
1194 
1195  /* copy product */
1196  wcscpy(Preferences.DeviceName, szProduct);
1197 
1198  /* Disable the 'Advanced Controls' menu item */
1200 
1201  /* create status window */
1202  if (MixerWindow->Mode == NORMAL_MODE)
1203  {
1204  MixerWindow->hStatusBar = CreateStatusWindow(WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS,
1205  NULL,
1206  hwnd,
1207  0);
1208  if (MixerWindow->hStatusBar)
1209  {
1210  SendMessage(MixerWindow->hStatusBar,
1211  WM_SETTEXT,
1212  0,
1213  (LPARAM)szProduct);
1214  }
1215  }
1216 
1218  {
1219  DPRINT("Rebuilding mixer window controls failed!\n");
1220  SndMixerDestroy(MixerWindow->Mixer);
1221  MixerWindow->Mixer = NULL;
1222  Result = -1;
1223  }
1224  }
1225  break;
1226  }
1227 
1228  case WM_DESTROY:
1229  {
1230  MixerWindow = GetWindowData(hwnd,
1231  MIXER_WINDOW);
1232  if (MixerWindow != NULL)
1233  {
1234  if (MixerWindow->Mixer != NULL)
1235  {
1236  SndMixerDestroy(MixerWindow->Mixer);
1237  }
1238  if (MixerWindow->hFont)
1239  DeleteObject(MixerWindow->hFont);
1240  HeapFree(hAppHeap, 0, MixerWindow);
1241  }
1242  break;
1243  }
1244 
1245  case WM_CLOSE:
1246  {
1247  PostQuitMessage(0);
1248  break;
1249  }
1250 
1251  default:
1252  {
1254  uMsg,
1255  wParam,
1256  lParam);
1257  break;
1258  }
1259  }
1260 
1261  return Result;
1262 }
1263 
1264 static BOOL
1266 {
1267  WNDCLASSEX wc;
1268 
1269  wc.cbSize = sizeof(WNDCLASSEX);
1270  wc.style = CS_HREDRAW | CS_VREDRAW;
1272  wc.cbClsExtra = 0;
1273  wc.cbWndExtra = sizeof(PMIXER_WINDOW);
1274  wc.hInstance = hAppInstance;
1277  wc.hCursor = LoadCursor(NULL,
1278  IDC_ARROW);
1279  wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
1280  wc.lpszMenuName = NULL;
1282  wc.hIconSm = NULL;
1284 
1285  return MainWindowClass != 0;
1286 }
1287 
1288 static VOID
1290 {
1292  hAppInstance);
1293 }
1294 
1295 static HWND
1297  WINDOW_MODE WindowMode,
1298  UINT MixerId)
1299 {
1300  HWND hWnd;
1301 
1302  PMIXER_WINDOW MixerWindow = HeapAlloc(hAppHeap,
1304  sizeof(MIXER_WINDOW));
1305  if (MixerWindow == NULL)
1306  {
1307  return NULL;
1308  }
1309 
1310  MixerWindow->Mode = WindowMode;
1311  MixerWindow->MixerId = MixerId;
1312 
1313  if (mixerGetNumDevs() > 0)
1314  {
1316  SZ_APP_CLASS,
1317  lpAppTitle,
1319  0, 0, 300, 315,
1320  NULL,
1323  hAppInstance,
1324  MixerWindow);
1325  }
1326  else
1327  {
1328  LPTSTR lpErrMessage;
1329 
1330  /*
1331  * no mixer devices are available!
1332  */
1333 
1334  hWnd = NULL;
1335  if (AllocAndLoadString(&lpErrMessage,
1336  hAppInstance,
1338  {
1339  MessageBox(NULL,
1340  lpErrMessage,
1341  lpAppTitle,
1343  LocalFree(lpErrMessage);
1344  }
1345  }
1346 
1347  if (hWnd == NULL)
1348  {
1350  0,
1351  MixerWindow);
1352  }
1353 
1354  return hWnd;
1355 }
1356 
1357 static
1358 BOOL
1360  DWORD dwStyle,
1361  PWINDOW_MODE pMode,
1362  PUINT pMixerId)
1363 {
1364  TCHAR option;
1365 
1366  *pMixerId = PLAY_MIXER;
1367  *pMode = (dwStyle & 0x20) ? SMALL_MODE : NORMAL_MODE;
1368 
1369  while (*cmdline == _T(' ') || *cmdline == _T('-') || *cmdline == _T('/'))
1370  {
1371  if (*cmdline++ == _T(' '))
1372  continue;
1373 
1374  option = *cmdline;
1375  if (option)
1376  cmdline++;
1377  while (*cmdline == _T(' '))
1378  cmdline++;
1379 
1380  switch (option)
1381  {
1382  case 'd': /* Device */
1383  case 'D':
1384  break;
1385 
1386  case 'n': /* Small size */
1387  case 'N':
1388  *pMode = NORMAL_MODE;
1389  break;
1390 
1391  case 's': /* Small size */
1392  case 'S':
1393  *pMode = SMALL_MODE;
1394  break;
1395 
1396  case 't': /* Tray size */
1397  case 'T':
1398  *pMode = TRAY_MODE;
1399  break;
1400 
1401  case 'p': /* Play mode */
1402  case 'P':
1403  *pMixerId = PLAY_MIXER;
1404  break;
1405 
1406  case 'r': /* Record mode */
1407  case 'R':
1408  *pMixerId = RECORD_MIXER;
1409  break;
1410 
1411  default:
1412  return FALSE;
1413  }
1414  }
1415 
1416  return TRUE;
1417 }
1418 
1419 int WINAPI
1421  HINSTANCE hPrevInstance,
1422  LPTSTR lpszCmdLine,
1423  int nCmdShow)
1424 {
1425  MSG Msg;
1426  int Ret = 1;
1427  INITCOMMONCONTROLSEX Controls;
1428  WINDOW_MODE WindowMode = SMALL_MODE;
1429  UINT MixerId = 0;
1430  DWORD dwStyle;
1431 
1432  UNREFERENCED_PARAMETER(hPrevInstance);
1433  UNREFERENCED_PARAMETER(nCmdShow);
1434 
1437 
1438  if (InitAppConfig())
1439  {
1440  dwStyle = GetStyleValue();
1441  HandleCommandLine(lpszCmdLine, dwStyle, &WindowMode, &MixerId);
1442 
1443  /* load the application title */
1445  hAppInstance,
1446  IDS_SNDVOL32))
1447  {
1448  lpAppTitle = NULL;
1449  }
1450 
1451  Controls.dwSize = sizeof(INITCOMMONCONTROLSEX);
1453 
1454  InitCommonControlsEx(&Controls);
1455 
1456  if (WindowMode == TRAY_MODE)
1457  {
1460  NULL,
1461  TrayDlgProc,
1462  0);
1463  }
1464  else
1465  {
1467  {
1468  hMainWnd = CreateApplicationWindow(WindowMode, MixerId);
1469  if (hMainWnd != NULL)
1470  {
1471  BOOL bRet;
1472  while ((bRet =GetMessage(&Msg,
1473  NULL,
1474  0,
1475  0)) != 0)
1476  {
1477  if (bRet != -1)
1478  {
1480  DispatchMessage(&Msg);
1481  }
1482  }
1483 
1485  Ret = 0;
1486  }
1487  else
1488  {
1489  DPRINT("Failed to create application window (LastError: %d)!\n", GetLastError());
1490  }
1491 
1493  }
1494  else
1495  {
1496  DPRINT("Failed to register application classes (LastError: %d)!\n", GetLastError());
1497  }
1498  }
1499 
1500  if (lpAppTitle != NULL)
1501  {
1503  }
1504 
1505  CloseAppConfig();
1506  }
1507  else
1508  {
1509  DPRINT("Unable to open the Volume Control registry key!\n");
1510  }
1511 
1512  return Ret;
1513 }
#define WS_CLIPSIBLINGS
Definition: pedump.c:618
LPMIXERLINE Line
Definition: sndvol32.h:131
#define TB_THUMBTRACK
Definition: commctrl.h:2050
#define IDC_LINE_SLIDER_VERT
Definition: resources.h:25
#define CB_SETITEMDATA
Definition: winuser.h:1927
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
UINT style
Definition: winuser.h:3155
#define MAKEINTRESOURCE
Definition: winuser.h:591
BOOL WINAPI CheckDlgButton(_In_ HWND, _In_ int, _In_ UINT)
#define WS_EX_WINDOWEDGE
Definition: winuser.h:407
#define WM_SYSCOLORCHANGE
Definition: winuser.h:1608
#define DispatchMessage
Definition: winuser.h:5631
BOOL ReadLineConfig(IN LPTSTR szDeviceName, IN LPTSTR szLineName, IN LPTSTR szControlName, OUT DWORD *Flags)
Definition: misc.c:197
#define SND_ALIAS_ID
Definition: mmsystem.h:161
BOOL WINAPI TranslateMessage(_In_ const MSG *)
static HICON
Definition: imagelist.c:84
UINT WINAPI GetDlgItemTextW(HWND hDlg, int nIDDlgItem, LPWSTR lpString, int nMaxCount)
Definition: dialog.c:2195
LPCSTR lpszMenuName
Definition: winuser.h:3163
#define TRUE
Definition: types.h:120
const CHAR * LPCTSTR
Definition: xmlstorage.h:193
#define IDOK
Definition: winuser.h:824
LPTSTR lpAppTitle
Definition: sndvol32.c:34
#define RegisterClassEx
Definition: winuser.h:5703
#define IDC_MIXERDEVICE
Definition: resources.h:15
struct png_info_def **typedef void(__cdecl typeof(png_destroy_read_struct))(struct png_struct_def **
Definition: typeof.h:47
#define IDD_PREFERENCES
Definition: resources.h:53
UINT MixerId
Definition: sndvol32.h:52
#define LVCF_WIDTH
Definition: commctrl.h:2559
#define MF_BYCOMMAND
Definition: winuser.h:202
VOID CloseAppConfig(VOID)
Definition: misc.c:152
INT SndMixerGetLineName(PSND_MIXER Mixer, DWORD LineID, LPTSTR lpBuffer, UINT uSize, BOOL LongName)
Definition: mixer.c:390
HCURSOR hCursor
Definition: winuser.h:3161
#define IDM_ABOUT
Definition: resource.h:29
WNDPROC lpfnWndProc
Definition: winuser.h:3156
#define LVCF_TEXT
Definition: commctrl.h:2560
LPCSTR lpszClassName
Definition: winuser.h:3164
WORD ATOM
Definition: dimm.idl:113
static BOOL RebuildMixerWindowControls(PPREFERENCES_CONTEXT PrefContext)
Definition: sndvol32.c:616
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:323
__wchar_t WCHAR
Definition: xmlstorage.h:180
enum _WINDOW_MODE WINDOW_MODE
PREFERENCES_CONTEXT Preferences
Definition: sndvol32.c:35
#define DWORD
Definition: msvc.h:34
#define IDC_CONTROLS
Definition: resources.h:21
#define CB_GETITEMDATA
Definition: winuser.h:1911
struct _PREFERENCES_CONTEXT * PPREFERENCES_CONTEXT
#define ListView_GetItemText(hwndLV, i, iSubItem_, pszText_, cchTextMax_)
Definition: commctrl.h:2656
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1827
HFONT hFont
Definition: sndvol32.h:56
#define BALANCE_LEFT
Definition: sndvol32.h:22
#define CALLBACK
Definition: compat.h:27
static BOOL RegisterApplicationClasses(VOID)
Definition: sndvol32.c:1265
HWND hWnd
Definition: settings.c:17
ATOM MainWindowClass
Definition: sndvol32.c:31
HINSTANCE hAppInstance
Definition: sndvol32.c:30
BOOL SndMixerEnumConnections(PSND_MIXER Mixer, DWORD LineID, PFNSNDMIXENUMCONNECTIONS EnumProc, PVOID Context)
Definition: mixer.c:552
struct _SET_VOLUME_CONTEXT * PSET_VOLUME_CONTEXT
#define WS_DLGFRAME
Definition: pedump.c:626
#define assert(x)
Definition: debug.h:53
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
_Inout_ __drv_aliasesMem PSLIST_ENTRY _Inout_ PSLIST_ENTRY _In_ ULONG Count
Definition: exfuncs.h:1015
#define ZeroMemory
Definition: winbase.h:1635
#define CS_HREDRAW
Definition: winuser.h:648
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
VOID UpdateDialogLineSliderControl(PPREFERENCES_CONTEXT PrefContext, LPMIXERLINE Line, DWORD dwDialogID, DWORD Position)
Definition: dialog.c:798
#define GWL_USERDATA
Definition: winuser.h:855
static BOOL HandleCommandLine(LPTSTR cmdline, DWORD dwStyle, PWINDOW_MODE pMode, PUINT pMixerId)
Definition: sndvol32.c:1359
static BOOL CALLBACK SetVolumeCallback(PSND_MIXER Mixer, DWORD LineID, LPMIXERLINE Line, PVOID Ctx)
Definition: sndvol32.c:630
#define VOLUME_MAX
Definition: sndvol32.h:19
static VOID DeleteMixerWindowControls(PMIXER_WINDOW MixerWindow)
Definition: sndvol32.c:597
VOID LoadDialogCtrls(PPREFERENCES_CONTEXT PrefContext)
Definition: dialog.c:674
#define WS_CHILD
Definition: pedump.c:617
#define SendDlgItemMessage
Definition: winuser.h:5708
TCHAR * cmdline
Definition: stretchblt.cpp:32
HICON hIconSm
Definition: winuser.h:3165
PSND_MIXER Mixer
Definition: sndvol32.h:106
INT_PTR CALLBACK TrayDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: tray.c:262
int32_t INT_PTR
Definition: typedefs.h:62
static INT AllocAndLoadString(OUT LPTSTR *lpTarget, IN HINSTANCE hInst, IN UINT uID)
Definition: misc.c:60
#define WS_CLIPCHILDREN
Definition: pedump.c:619
LONG right
Definition: windef.h:293
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpszCmdLine, int nCmdShow)
Definition: sndvol32.c:1420
CREATESTRUCTA * LPCREATESTRUCT
Definition: winuser.h:5592
BOOL WINAPI DestroyWindow(_In_ HWND)
struct tagINITCOMMONCONTROLSEX INITCOMMONCONTROLSEX
int32_t INT
Definition: typedefs.h:56
#define RECORD_MIXER
Definition: sndvol32.h:30
#define SetWindowLongPtr
Definition: treelist.c:70
#define CB_GETCURSEL
Definition: winuser.h:1904
#define IDM_ADVANCED_CONTROLS
Definition: resources.h:10
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)
WPARAM wParam
Definition: combotst.c:138
CHAR * LPTSTR
Definition: xmlstorage.h:192
#define SZ_APP_CLASS
Definition: sndvol32.h:65
DWORD Id
#define MIXERCONTROL_CT_CLASS_MASK
Definition: mmsystem.h:353
UINT_PTR WPARAM
Definition: windef.h:207
#define LVIF_TEXT
Definition: commctrl.h:2281
#define LVM_INSERTCOLUMN
Definition: commctrl.h:2606
struct _PREFERENCES_FILL_DEVICES * PPREFERENCES_FILL_DEVICES
int WINAPI GetDlgCtrlID(_In_ HWND)
INT SndMixerSetVolumeControlDetails(PSND_MIXER Mixer, DWORD dwControlID, DWORD cChannels, DWORD cbDetails, LPVOID paDetails)
Definition: mixer.c:474
#define BALANCE_CENTER
Definition: sndvol32.h:23
INT_PTR CALLBACK AdvancedDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: advanced.c:67
HANDLE hAppHeap
Definition: sndvol32.c:33
BOOL SndMixerQueryControls(PSND_MIXER Mixer, PUINT DisplayControls, LPMIXERLINE LineInfo, LPMIXERCONTROL *Controls)
Definition: mixer.c:112
#define IDS_SNDVOL32
Definition: resources.h:41
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define LVCOLUMN
Definition: commctrl.h:2553
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
HINSTANCE hInstance
Definition: charmap.c:20
VOID UpdateDialogLineSwitchControl(PPREFERENCES_CONTEXT PrefContext, LPMIXERLINE Line, LONG fValue)
Definition: dialog.c:752
BOOL WINAPI EnableMenuItem(_In_ HMENU, _In_ UINT, _In_ UINT)
#define WS_EX_CONTROLPARENT
Definition: winuser.h:387
#define MIXERCONTROL_CT_CLASS_SWITCH
Definition: mmsystem.h:356
BOOL SndMixerEnumLines(PSND_MIXER Mixer, PFNSNDMIXENUMLINES EnumProc, PVOID Context)
Definition: mixer.c:526
HINSTANCE hInstance
Definition: winuser.h:3159
#define BALANCE_RIGHT
Definition: sndvol32.h:24
HWND * Window
Definition: sndvol32.h:48
LONG_PTR LPARAM
Definition: windef.h:208
#define CreateStatusWindow
Definition: commctrl.h:1905
#define TBM_GETPOS
Definition: commctrl.h:2003
static BOOL CALLBACK PrefDlgAddConnection(PSND_MIXER Mixer, DWORD LineID, LPMIXERLINE Line, PVOID Context)
Definition: sndvol32.c:166
#define LVM_INSERTITEM
Definition: commctrl.h:2378
static LRESULT CALLBACK MainWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: sndvol32.c:876
struct _SND_MIXER * Mixer
Definition: sndvol32.h:45
#define CreateWindowEx
Definition: winuser.h:5621
#define IDC_LINE_NAME
Definition: resources.h:22
#define CB_ADDSTRING
Definition: winuser.h:1897
smooth NULL
Definition: ftsmooth.c:416
Definition: getopt.h:108
#define IDC_LINE
Definition: resources.h:19
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:426
#define IDC_RECORDING
Definition: resources.h:17
UINT cbSize
Definition: winuser.h:3154
void DPRINT(...)
Definition: polytest.cpp:61
#define ListView_GetItemCount(hwnd)
Definition: commctrl.h:2279
static HWND CreateApplicationWindow(WINDOW_MODE WindowMode, UINT MixerId)
Definition: sndvol32.c:1296
#define BM_GETCHECK
Definition: winuser.h:1879
#define WM_SETTEXT
Definition: winuser.h:1599
BOOL bShowExtendedControls
Definition: sndvol32.h:54
struct _PREFERENCES_FILL_DEVICES PREFERENCES_FILL_DEVICES
HBRUSH hbrBackground
Definition: winuser.h:3162
#define CB_ERR
Definition: winuser.h:2389
#define DefWindowProc
Definition: ros2win.h:31
#define WM_DESTROY
Definition: winuser.h:1591
GLuint GLenum option
Definition: glext.h:11211
#define PtrToUlong(p)
Definition: basetsd.h:83
#define SND_ALIAS_SYSTEMDEFAULT
Definition: mmsystem.h:175
static BOOL CALLBACK FillDeviceComboBox(PSND_MIXER Mixer, UINT Id, LPCTSTR ProductName, PVOID Context)
Definition: sndvol32.c:54
#define IDM_MAINMENU
Definition: resources.h:3
#define MF_CHECKED
Definition: winuser.h:132
#define WS_CAPTION
Definition: pedump.c:624
#define CS_VREDRAW
Definition: winuser.h:653
BOOL WriteLineConfig(IN LPTSTR szDeviceName, IN LPTSTR szLineName, IN PSNDVOL_REG_LINESTATE LineState, IN DWORD cbSize)
Definition: misc.c:162
char TCHAR
Definition: xmlstorage.h:189
#define ICC_BAR_CLASSES
Definition: commctrl.h:60
#define _T(x)
Definition: vfdio.h:22
PSND_MIXER Mixer
Definition: sndvol32.h:130
unsigned int BOOL
Definition: ntddk_ex.h:94
#define IDC_LINE_ADVANCED
Definition: resources.h:26
#define GetProcessHeap()
Definition: compat.h:395
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
static BOOL CALLBACK PrefDlgAddLine(PSND_MIXER Mixer, LPMIXERLINE Line, UINT DisplayControls, PVOID Context)
Definition: sndvol32.c:89
#define WM_CLOSE
Definition: winuser.h:1603
INT SndMixerGetVolumeControlDetails(PSND_MIXER Mixer, DWORD dwControlID, DWORD cChannels, DWORD cbDetails, LPVOID paDetails)
Definition: mixer.c:498
UINT WindowCount
Definition: sndvol32.h:47
#define GetWindowData(hwnd, type)
Definition: sndvol32.c:39
unsigned int UINT
Definition: ndis.h:50
static const UCHAR Index[8]
Definition: usbohci.c:18
#define BN_CLICKED
Definition: winuser.h:1886
unsigned long DWORD
Definition: ntddk_ex.h:95
int cbWndExtra
Definition: winuser.h:3158
DWORD WINAPI CheckMenuItem(_In_ HMENU, _In_ UINT, _In_ UINT)
#define ShellAbout
Definition: shellapi.h:680
static VOID WriteLineSettings(PPREFERENCES_CONTEXT Context, HWND hwndDlg)
Definition: sndvol32.c:345
#define SND_ASYNC
Definition: mmsystem.h:154
WINDOW_MODE Mode
Definition: sndvol32.h:51
#define ListView_SetExtendedListViewStyle(hwndLV, dw)
Definition: commctrl.h:2697
UINT SndMixerGetSelection(PSND_MIXER Mixer)
Definition: mixer.c:361
struct _MIXER_WINDOW * PMIXER_WINDOW
Definition: ncftp.h:79
#define TB_ENDTRACK
Definition: commctrl.h:2053
#define MB_ICONINFORMATION
Definition: winuser.h:796
#define DialogBoxParam
Definition: winuser.h:5630
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
HICON hIcon
Definition: winuser.h:3160
static const WCHAR L[]
Definition: oid.c:1250
#define LVS_EX_CHECKBOXES
Definition: commctrl.h:2703
BOOL WINAPI InitCommonControlsEx(const INITCOMMONCONTROLSEX *lpInitCtrls)
Definition: commctrl.c:893
#define GetDialogData(hwndDlg, type)
Definition: sndvol32.c:37
#define DWLP_USER
Definition: winuser.h:866
#define GCLP_HICON
Definition: winuser.h:669
static VOID UpdatePrefDlgControls(PPREFERENCES_CONTEXT Context, DWORD LineID)
Definition: sndvol32.c:230
#define COLOR_BTNFACE
Definition: winuser.h:918
#define IDM_PROPERTIES
Definition: resources.h:9
#define MessageBox
Definition: winuser.h:5688
#define CB_SETCURSEL
Definition: winuser.h:1922
BOOL SndMixerEnumProducts(PSND_MIXER Mixer, PFNSNDMIXENUMPRODUCTS EnumProc, PVOID Context)
Definition: mixer.c:431
#define WM_COMMAND
Definition: winuser.h:1716
#define IDC_OTHER
Definition: resources.h:18
#define MIXER_LONG_NAME_CHARS
Definition: mmsystem.h:294
#define MF_UNCHECKED
Definition: winuser.h:204
#define BST_UNCHECKED
Definition: winuser.h:199
#define WINAPI
Definition: msvc.h:20
#define wcsicmp
Definition: string.h:1152
PPREFERENCES_CONTEXT PrefContext
Definition: sndvol32.c:48
#define LoadCursor
Definition: winuser.h:5678
static const WCHAR Control[]
Definition: interface.c:27
#define BALANCE_STEPS
Definition: sndvol32.h:25
#define IDC_PLAYBACK
Definition: resources.h:16
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
TCHAR DeviceName[128]
Definition: sndvol32.h:114
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
int cbClsExtra
Definition: winuser.h:3157
#define PlaySound
Definition: mmsystem.h:2832
#define TEXT(s)
Definition: k32.h:26
enum _WINDOW_MODE * PWINDOW_MODE
#define ListView_GetCheckState(hwndLV, i)
Definition: commctrl.h:2649
#define LoadMenu
Definition: winuser.h:5683
#define IDC_LINE_SLIDER_HORZ
Definition: resources.h:24
VOID SndMixerDestroy(PSND_MIXER Mixer)
Definition: mixer.c:91
#define WS_MINIMIZEBOX
Definition: pedump.c:631
#define MIXERCONTROL_CT_CLASS_FADER
Definition: mmsystem.h:359
#define MIXERLINE_COMPONENTTYPE_DST_SPEAKERS
Definition: mmsystem.h:319
static BOOL CALLBACK MixerControlChangeCallback(PSND_MIXER Mixer, DWORD LineID, LPMIXERLINE Line, PVOID Context)
Definition: sndvol32.c:755
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1577
UINT WINAPI mixerGetNumDevs(void)
Definition: winmm.c:283
BOOL InitAppConfig(VOID)
Definition: misc.c:138
#define VOLUME_MIN
Definition: sndvol32.h:18
struct @1565 Msg[]
#define IDS_NOMIXERDEVICES
Definition: resources.h:42
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
WCHAR LineName[MIXER_LONG_NAME_CHARS]
Definition: sndvol32.h:129
#define WM_HSCROLL
Definition: winuser.h:1719
static INT_PTR CALLBACK DlgPreferencesProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: sndvol32.c:407
#define GetMessage
Definition: winuser.h:5656
#define MIXERLINE_COMPONENTTYPE_DST_WAVEIN
Definition: mmsystem.h:322
#define HEAP_ZERO_MEMORY
Definition: compat.h:123
#define IDM_EXIT
Definition: resource.h:27
#define CBN_SELCHANGE
Definition: winuser.h:1940
#define PLAY_MIXER
Definition: sndvol32.h:29
#define MAXPNAMELEN
Definition: mmsystem.h:24
#define BST_CHECKED
Definition: winuser.h:197
#define IDC_ARROW
Definition: winuser.h:682
#define ListView_SetCheckState(hwndLV, i, fCheck)
Definition: commctrl.h:2646
BOOL SndMixerSelect(PSND_MIXER Mixer, UINT MixerId)
Definition: mixer.c:304
#define SendMessage
Definition: winuser.h:5709
#define LVIF_PARAM
Definition: commctrl.h:2283
#define WM_CREATE
Definition: winuser.h:1590
#define LVITEM
Definition: commctrl.h:2347
struct tagContext Context
Definition: acpixf.h:1012
#define HIWORD(l)
Definition: typedefs.h:246
INT SndMixerGetProductName(PSND_MIXER Mixer, LPTSTR lpBuffer, UINT uSize)
Definition: mixer.c:367
#define ICC_STANDARD_CLASSES
Definition: commctrl.h:73
#define MM_MIXM_LINE_CHANGE
Definition: mmsystem.h:82
PSND_MIXER SndMixerCreate(HWND hWndNotification, UINT MixerId)
Definition: mixer.c:69
WNDCLASSEXA WNDCLASSEX
Definition: winuser.h:5585
#define LoadIcon
Definition: winuser.h:5679
#define MF_GRAYED
Definition: winuser.h:129
static VOID UnregisterApplicationClasses(VOID)
Definition: sndvol32.c:1289
DWORD GetStyleValue(VOID)
Definition: misc.c:278
#define IDCANCEL
Definition: winuser.h:825
LONG_PTR LRESULT
Definition: windef.h:209
#define UINT
Definition: msvc.h:27
#define WS_VISIBLE
Definition: pedump.c:620
#define UnregisterClass
Definition: winuser.h:5727
#define WS_SYSMENU
Definition: pedump.c:629
#define IDD_ADVANCED
Definition: resource.h:10
HMENU WINAPI GetMenu(_In_ HWND)
HWND hMainWnd
Definition: sndvol32.c:32
#define WM_INITDIALOG
Definition: winuser.h:1715
LPARAM lParam
Definition: combotst.c:139
#define LOWORD(l)
Definition: pedump.c:82
#define HeapFree(x, y, z)
Definition: compat.h:394
#define GetClassLongPtrW
Definition: winuser.h:4433
__analysis_noreturn void WINAPI PostQuitMessage(_In_ int)
HWND hStatusBar
Definition: sndvol32.h:44
unsigned int * PUINT
Definition: ndis.h:50
#define IDD_TRAY_MASTER
Definition: resources.h:52
#define LPARAM
Definition: msvc.h:38
#define WM_VSCROLL
Definition: winuser.h:1720
#define IDI_MAINAPP
Definition: resource.h:6
#define ListView_DeleteAllItems(hwnd)
Definition: commctrl.h:2386
PMIXER_WINDOW MixerWindow
Definition: sndvol32.h:105
LPMIXERLINE SndMixerGetLineByName(PSND_MIXER Mixer, DWORD LineID, LPWSTR LineName)
Definition: mixer.c:615
#define IDC_LINE_SWITCH
Definition: resources.h:23
#define MM_MIXM_CONTROL_CHANGE
Definition: mmsystem.h:83