https://git.reactos.org/?p=reactos.git;a=commitdiff;h=397fe9c8173bee56a480e…
commit 397fe9c8173bee56a480e1f10b2055a4f37b59c2
Author: Eric Kohl <eric.kohl(a)reactos.org>
AuthorDate: Sun Feb 10 22:17:15 2019 +0100
Commit: Eric Kohl <eric.kohl(a)reactos.org>
CommitDate: Sun Feb 10 22:17:15 2019 +0100
[SNDVOL32] Implement the volume and balance trackbar for mono and stereo lines.
---
base/applications/sndvol32/sndvol32.c | 95 ++++++++++++++++++++++++++++++-----
1 file changed, 83 insertions(+), 12 deletions(-)
diff --git a/base/applications/sndvol32/sndvol32.c
b/base/applications/sndvol32/sndvol32.c
index 864228e47e..29e6dcf367 100644
--- a/base/applications/sndvol32/sndvol32.c
+++ b/base/applications/sndvol32/sndvol32.c
@@ -632,7 +632,7 @@ SetVolumeCallback(PSND_MIXER Mixer, DWORD LineID, LPMIXERLINE Line,
PVOID Ctx)
{
UINT ControlCount = 0, Index;
LPMIXERCONTROL Control = NULL;
- MIXERCONTROLDETAILS_UNSIGNED uDetails;
+ PMIXERCONTROLDETAILS_UNSIGNED puDetails = NULL;
MIXERCONTROLDETAILS_BOOLEAN bDetails;
PSET_VOLUME_CONTEXT Context = (PSET_VOLUME_CONTEXT)Ctx;
@@ -650,6 +650,10 @@ SetVolumeCallback(PSND_MIXER Mixer, DWORD LineID, LPMIXERLINE Line,
PVOID Ctx)
return FALSE;
}
+ puDetails = HeapAlloc(GetProcessHeap(), 0, Line->cChannels *
sizeof(MIXERCONTROLDETAILS_UNSIGNED));
+ if (puDetails == NULL)
+ return FALSE;
+
/* now go through all controls and compare control ids */
for (Index = 0; Index < ControlCount; Index++)
{
@@ -657,13 +661,63 @@ SetVolumeCallback(PSND_MIXER Mixer, DWORD LineID, LPMIXERLINE Line,
PVOID Ctx)
{
if ((Control[Index].dwControlType & MIXERCONTROL_CT_CLASS_MASK) ==
MIXERCONTROL_CT_CLASS_FADER)
{
- DWORD Step = (Control[Index].Bounds.dwMaximum -
Control[Index].Bounds.dwMinimum) / (VOLUME_MAX - VOLUME_MIN);
+ DWORD LineOffset, volumePosition, balancePosition;
+ DWORD volumeStep, balanceStep;
- /* set up details */
- uDetails.dwValue = ((VOLUME_MAX - Context->SliderPos) * Step) +
Control[Index].Bounds.dwMinimum;
+ LineOffset = Context->SliderPos;
+
+ volumePosition =
(DWORD)SendDlgItemMessage(Preferences.MixerWindow->hWnd, LineOffset *
IDC_LINE_SLIDER_VERT, TBM_GETPOS, 0, 0);
+ volumeStep = (Control[Index].Bounds.dwMaximum -
Control[Index].Bounds.dwMinimum) / (VOLUME_MAX - VOLUME_MIN);
+
+ if (Line->cChannels == 1)
+ {
+ /* set up details */
+ puDetails[0].dwValue = ((VOLUME_MAX - volumePosition) * volumeStep) +
Control[Index].Bounds.dwMinimum;
+ }
+ else if (Line->cChannels == 2)
+ {
+ balancePosition =
(DWORD)SendDlgItemMessage(Preferences.MixerWindow->hWnd, LineOffset *
IDC_LINE_SLIDER_HORZ, TBM_GETPOS, 0, 0);
+ if (balancePosition == BALANCE_CENTER)
+ {
+ puDetails[0].dwValue = ((VOLUME_MAX - volumePosition) *
volumeStep) + Control[Index].Bounds.dwMinimum;
+ puDetails[1].dwValue = ((VOLUME_MAX - volumePosition) *
volumeStep) + Control[Index].Bounds.dwMinimum;
+ }
+ else if (balancePosition == BALANCE_LEFT)
+ {
+ puDetails[0].dwValue = ((VOLUME_MAX - volumePosition) *
volumeStep) + Control[Index].Bounds.dwMinimum;
+ puDetails[1].dwValue = Control[Index].Bounds.dwMinimum;
+ }
+ else if (balancePosition == BALANCE_RIGHT)
+ {
+ puDetails[0].dwValue = Control[Index].Bounds.dwMinimum;
+ puDetails[1].dwValue = ((VOLUME_MAX - volumePosition) *
volumeStep) + Control[Index].Bounds.dwMinimum;
+ }
+ else if (balancePosition < BALANCE_CENTER) // Left
+ {
+ puDetails[0].dwValue = ((VOLUME_MAX - volumePosition) *
volumeStep) + Control[Index].Bounds.dwMinimum;
+
+ balanceStep = (puDetails[0].dwValue -
Control[Index].Bounds.dwMinimum) / (BALANCE_STEPS / 2);
+
+ puDetails[1].dwValue = (balancePosition * balanceStep) +
Control[Index].Bounds.dwMinimum;
+ }
+ else if (balancePosition > BALANCE_CENTER) // Right
+ {
+ puDetails[1].dwValue = ((VOLUME_MAX - volumePosition) *
volumeStep) + Control[Index].Bounds.dwMinimum;
+
+ balanceStep = (puDetails[1].dwValue -
Control[Index].Bounds.dwMinimum) / (BALANCE_STEPS / 2);
+
+ puDetails[0].dwValue = ((BALANCE_RIGHT - balancePosition) *
balanceStep) + Control[Index].Bounds.dwMinimum;
+ }
+ }
+ else
+ {
+ SndMixerGetVolumeControlDetails(Preferences.MixerWindow->Mixer,
Control[Index].dwControlID, Line->cChannels, sizeof(MIXERCONTROLDETAILS_UNSIGNED),
(LPVOID)puDetails);
+
+ /* FIXME */
+ }
/* set volume */
- SndMixerSetVolumeControlDetails(Preferences.MixerWindow->Mixer,
Control[Index].dwControlID, 1, sizeof(MIXERCONTROLDETAILS_UNSIGNED),
(LPVOID)&uDetails);
+ SndMixerSetVolumeControlDetails(Preferences.MixerWindow->Mixer,
Control[Index].dwControlID, Line->cChannels, sizeof(MIXERCONTROLDETAILS_UNSIGNED),
(LPVOID)puDetails);
/* done */
break;
@@ -683,13 +737,11 @@ SetVolumeCallback(PSND_MIXER Mixer, DWORD LineID, LPMIXERLINE Line,
PVOID Ctx)
break;
}
}
- else
- {
- /* FIXME: implement left - right channel switch support */
- assert(0);
- }
}
+ if (puDetails != NULL)
+ HeapFree(GetProcessHeap(), 0, puDetails);
+
/* free controls */
HeapFree(GetProcessHeap(), 0, Control);
@@ -997,7 +1049,7 @@ MainWindowProc(HWND hwnd,
if (GetDlgItemTextW(hwnd, CtrlID, Context.LineName,
MIXER_LONG_NAME_CHARS) != 0)
{
/* setup context */
- Context.SliderPos = HIWORD(wParam);
+ Context.SliderPos = LineOffset;
Context.bVertical = TRUE;
Context.bSwitch = FALSE;
@@ -1029,7 +1081,26 @@ MainWindowProc(HWND hwnd,
switch (LOWORD(wParam))
{
case TB_THUMBTRACK:
- /* FIXME */
+ /* get dialog item ctrl */
+ CtrlID = GetDlgCtrlID((HWND)lParam);
+
+ /* get line index */
+ LineOffset = CtrlID / IDC_LINE_SLIDER_HORZ;
+
+ /* compute window id of line name static control */
+ CtrlID = LineOffset * IDC_LINE_NAME;
+
+ /* get line name */
+ if (GetDlgItemTextW(hwnd, CtrlID, Context.LineName,
MIXER_LONG_NAME_CHARS) != 0)
+ {
+ /* setup context */
+ Context.SliderPos = LineOffset;
+ Context.bVertical = TRUE;
+ Context.bSwitch = FALSE;
+
+ /* set volume */
+ SndMixerEnumConnections(Preferences.MixerWindow->Mixer,
Preferences.SelectedLine, SetVolumeCallback, (LPVOID)&Context);
+ }
break;
case TB_ENDTRACK: