https://git.reactos.org/?p=reactos.git;a=commitdiff;h=26b52c4e061a4195bdaaa…
commit 26b52c4e061a4195bdaaab6184446d726021b453
Author: Eric Kohl <eric.kohl(a)reactos.org>
AuthorDate: Sun Feb 24 12:50:37 2019 +0100
Commit: Eric Kohl <eric.kohl(a)reactos.org>
CommitDate: Sun Feb 24 12:50:37 2019 +0100
[SNDVOL32] Advanced Controls dialog: Implemented the Bass and Treble trackbars.
Please check if they are working correctly. I have no way to check them myself.
---
base/applications/sndvol32/advanced.c | 115 ++++++++++++++++++++++++++++++----
1 file changed, 103 insertions(+), 12 deletions(-)
diff --git a/base/applications/sndvol32/advanced.c
b/base/applications/sndvol32/advanced.c
index a4f055f18f..a41112a931 100644
--- a/base/applications/sndvol32/advanced.c
+++ b/base/applications/sndvol32/advanced.c
@@ -7,11 +7,24 @@
#include "sndvol32.h"
+typedef struct _ADVANCED_DATA
+{
+ PADVANCED_CONTEXT Context;
+
+ BOOL bEnabled[4];
+ DWORD dwControlId[4];
+
+ /* Bass and Treble */
+ DWORD dwMaximum[2];
+ DWORD dwMinimum[2];
+
+} ADVANCED_DATA, *PADVANCED_DATA;
+
static
VOID
OnInitDialog(
HWND hwndDlg,
- PADVANCED_CONTEXT Context)
+ PADVANCED_DATA pData)
{
MIXERCONTROLDETAILS_UNSIGNED UnsignedDetails;
MIXERCONTROLDETAILS_BOOLEAN BooleanDetails;
@@ -25,7 +38,7 @@ OnInitDialog(
/* Set the dialog title */
LoadStringW(hAppInstance, IDS_ADVANCED_CONTROLS, szRawBuffer,
ARRAYSIZE(szRawBuffer));
- StringCchPrintfW(szCookedBuffer, ARRAYSIZE(szCookedBuffer), szRawBuffer,
Context->LineName);
+ StringCchPrintfW(szCookedBuffer, ARRAYSIZE(szCookedBuffer), szRawBuffer,
pData->Context->LineName);
SetWindowTextW(hwndDlg, szCookedBuffer);
/* Disable the tone controls */
@@ -54,7 +67,7 @@ OnInitDialog(
for (i = IDC_ADV_OTHER_CONTROLS; i<= IDC_ADV_OTHER_CHECK2; i++)
ShowWindow(GetDlgItem(hwndDlg, i), SW_HIDE);
- if (SndMixerQueryControls(Context->Mixer, &ControlCount, Context->Line,
&Control))
+ if (SndMixerQueryControls(pData->Context->Mixer, &ControlCount,
pData->Context->Line, &Control))
{
for (Index = 0; Index < ControlCount; Index++)
{
@@ -62,7 +75,7 @@ OnInitDialog(
{
/* Bass control */
- if (SndMixerGetVolumeControlDetails(Context->Mixer,
Control[Index].dwControlID, 1, sizeof(MIXERCONTROLDETAILS_UNSIGNED),
(LPVOID)&UnsignedDetails) != -1)
+ if (SndMixerGetVolumeControlDetails(pData->Context->Mixer,
Control[Index].dwControlID, 1, sizeof(MIXERCONTROLDETAILS_UNSIGNED),
(LPVOID)&UnsignedDetails) != -1)
{
for (i = IDC_ADV_BASS_LOW; i<= IDC_ADV_BASS_SLIDER; i++)
EnableWindow(GetDlgItem(hwndDlg, i), TRUE);
@@ -70,13 +83,18 @@ OnInitDialog(
dwStep = (Control[Index].Bounds.dwMaximum -
Control[Index].Bounds.dwMinimum) / (VOLUME_MAX - VOLUME_MIN);
dwPosition = (UnsignedDetails.dwValue -
Control[Index].Bounds.dwMinimum) / dwStep;
SendDlgItemMessageW(hwndDlg, IDC_ADV_BASS_SLIDER, TBM_SETPOS,
(WPARAM)TRUE, dwPosition);
+
+ pData->bEnabled[0] = TRUE;
+ pData->dwControlId[0] = Control[Index].dwControlID;
+ pData->dwMaximum[0] = Control[Index].Bounds.dwMaximum;
+ pData->dwMinimum[0] = Control[Index].Bounds.dwMinimum;
}
}
else if (Control[Index].dwControlType == MIXERCONTROL_CONTROLTYPE_TREBLE)
{
/* Treble control */
- if (SndMixerGetVolumeControlDetails(Context->Mixer,
Control[Index].dwControlID, 1, sizeof(MIXERCONTROLDETAILS_UNSIGNED),
(LPVOID)&UnsignedDetails) != -1)
+ if (SndMixerGetVolumeControlDetails(pData->Context->Mixer,
Control[Index].dwControlID, 1, sizeof(MIXERCONTROLDETAILS_UNSIGNED),
(LPVOID)&UnsignedDetails) != -1)
{
for (i = IDC_ADV_TREBLE_LOW; i<= IDC_ADV_TREBLE_SLIDER; i++)
EnableWindow(GetDlgItem(hwndDlg, i), TRUE);
@@ -84,6 +102,11 @@ OnInitDialog(
dwStep = (Control[Index].Bounds.dwMaximum -
Control[Index].Bounds.dwMinimum) / (VOLUME_MAX - VOLUME_MIN);
dwPosition = (UnsignedDetails.dwValue -
Control[Index].Bounds.dwMinimum) / dwStep;
SendDlgItemMessageW(hwndDlg, IDC_ADV_TREBLE_SLIDER, TBM_SETPOS,
(WPARAM)TRUE, dwPosition);
+
+ pData->bEnabled[1] = TRUE;
+ pData->dwControlId[1] = Control[Index].dwControlID;
+ pData->dwMaximum[1] = Control[Index].Bounds.dwMaximum;
+ pData->dwMinimum[1] = Control[Index].Bounds.dwMinimum;
}
}
else if (((Control[Index].dwControlType & (MIXERCONTROL_CT_CLASS_MASK |
MIXERCONTROL_CT_SUBCLASS_MASK | MIXERCONTROL_CT_UNITS_MASK)) ==
MIXERCONTROL_CONTROLTYPE_BOOLEAN) &&
@@ -93,7 +116,7 @@ OnInitDialog(
if (dwOtherControls < 2)
{
- if (SndMixerGetVolumeControlDetails(Context->Mixer,
Control[Index].dwControlID, 1, sizeof(MIXERCONTROLDETAILS_BOOLEAN),
(LPVOID)&BooleanDetails) != -1)
+ if (SndMixerGetVolumeControlDetails(pData->Context->Mixer,
Control[Index].dwControlID, 1, sizeof(MIXERCONTROLDETAILS_BOOLEAN),
(LPVOID)&BooleanDetails) != -1)
{
LoadStringW(hAppInstance, IDS_OTHER_CONTROLS1 + dwOtherControls,
szRawBuffer, ARRAYSIZE(szRawBuffer));
StringCchPrintfW(szCookedBuffer, ARRAYSIZE(szCookedBuffer),
szRawBuffer, Control[Index].szName);
@@ -103,6 +126,9 @@ OnInitDialog(
SendDlgItemMessageW(hwndDlg, IDC_ADV_OTHER_CHECK1 +
dwOtherControls, BM_SETCHECK, (WPARAM)BooleanDetails.fValue, 0);
+ pData->bEnabled[dwOtherControls + 2] = TRUE;
+ pData->dwControlId[dwOtherControls + 2] =
Control[Index].dwControlID;
+
dwOtherControls++;
}
}
@@ -122,7 +148,7 @@ OnInitDialog(
/* Resize the dialog */
GetWindowRect(hwndDlg, &rect);
- dy = MulDiv((dwOtherControls == 1) ? 73 : (73 + 15),
Context->MixerWindow->baseUnit.cy, 8);
+ dy = MulDiv((dwOtherControls == 1) ? 73 : (73 + 15),
pData->Context->MixerWindow->baseUnit.cy, 8);
rect.bottom += dy;
SetWindowPos(hwndDlg, HWND_TOP, rect.left, rect.top, rect.right - rect.left,
rect.bottom - rect.top, SWP_NOMOVE | SWP_NOZORDER);
@@ -142,7 +168,7 @@ OnInitDialog(
GetWindowRect(GetDlgItem(hwndDlg, IDC_ADV_OTHER_CONTROLS), &rect);
MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, 2);
- dy = MulDiv(15, Context->MixerWindow->baseUnit.cy, 8);
+ dy = MulDiv(15, pData->Context->MixerWindow->baseUnit.cy, 8);
rect.bottom += dy;
SetWindowPos(GetDlgItem(hwndDlg, IDC_ADV_OTHER_CONTROLS), HWND_TOP,
rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_NOMOVE |
SWP_NOZORDER);
@@ -151,6 +177,49 @@ OnInitDialog(
}
+static
+VOID
+OnHScroll(
+ HWND hwndDlg,
+ PADVANCED_DATA pData,
+ DWORD dwCtrlID)
+{
+ MIXERCONTROLDETAILS_UNSIGNED Details;
+ DWORD dwControlID = 0, dwStep, dwPosition;
+ DWORD dwMaximum, dwMinimum;
+
+ if (dwCtrlID != IDC_ADV_BASS_SLIDER ||
+ dwCtrlID != IDC_ADV_TREBLE_SLIDER)
+ return;
+
+ if (dwCtrlID == IDC_ADV_BASS_SLIDER)
+ {
+ if (pData->bEnabled[0] == FALSE)
+ return;
+
+ dwControlID = pData->dwControlId[0];
+ dwMaximum = pData->dwMaximum[0];
+ dwMinimum = pData->dwMinimum[0];
+ }
+ else if (dwCtrlID == IDC_ADV_TREBLE_SLIDER)
+ {
+ if (pData->bEnabled[1] == FALSE)
+ return;
+
+ dwControlID = pData->dwControlId[1];
+ dwMaximum = pData->dwMaximum[1];
+ dwMinimum = pData->dwMinimum[1];
+ }
+
+ dwPosition = (DWORD)SendDlgItemMessage(hwndDlg, dwCtrlID, TBM_GETPOS, 0, 0);
+ dwStep = (dwMaximum - dwMinimum) / (VOLUME_MAX - VOLUME_MIN);
+
+ Details.dwValue = (dwPosition * dwStep) + dwMinimum;
+
+ SndMixerSetVolumeControlDetails(pData->Context->Mixer, dwControlID, 1,
sizeof(MIXERCONTROLDETAILS_UNSIGNED), &Details);
+}
+
+
INT_PTR
CALLBACK
AdvancedDlgProc(
@@ -159,14 +228,20 @@ AdvancedDlgProc(
WPARAM wParam,
LPARAM lParam)
{
- PADVANCED_CONTEXT Context;
+ PADVANCED_DATA pData;
+
+ pData = (PADVANCED_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
switch (uMsg)
{
case WM_INITDIALOG:
- SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)lParam);
- Context = (PADVANCED_CONTEXT)((LONG_PTR)lParam);
- OnInitDialog(hwndDlg, Context);
+ pData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
sizeof(ADVANCED_DATA));
+ if (pData != NULL)
+ {
+ SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pData);
+ pData->Context = (PADVANCED_CONTEXT)((LONG_PTR)lParam);
+ OnInitDialog(hwndDlg, pData);
+ }
return TRUE;
case WM_COMMAND:
@@ -178,9 +253,25 @@ AdvancedDlgProc(
}
break;
+ case WM_HSCROLL:
+ if (pData != NULL)
+ {
+ if (LOWORD(wParam) == TB_THUMBTRACK)
+ OnHScroll(hwndDlg, pData, GetDlgCtrlID((HWND)lParam));
+ }
+ break;
+
case WM_CLOSE:
EndDialog(hwndDlg, IDCANCEL);
break;
+
+ case WM_DESTROY:
+ if (pData != NULL)
+ {
+ HeapFree(GetProcessHeap(), 0, pData);
+ SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)NULL);
+ }
+ break;
}
return FALSE;