https://git.reactos.org/?p=reactos.git;a=commitdiff;h=4ac1512259d6db2815114…
commit 4ac1512259d6db2815114c419501b199ce5aced3
Author: Eric Kohl <eric.kohl(a)reactos.org>
AuthorDate: Sun Feb 10 19:34:22 2019 +0100
Commit: Eric Kohl <eric.kohl(a)reactos.org>
CommitDate: Sun Feb 10 19:34:22 2019 +0100
[SNDVOL32] Initialize and update the volume and balance trackbars. Moving the
trackbars has no effect yet.
---
base/applications/sndvol32/dialog.c | 127 ++++++++++++++++++++++++++--------
base/applications/sndvol32/mixer.c | 8 +--
base/applications/sndvol32/sndvol32.c | 79 ++++++++++++++++++---
base/applications/sndvol32/sndvol32.h | 14 ++--
4 files changed, 180 insertions(+), 48 deletions(-)
diff --git a/base/applications/sndvol32/dialog.c b/base/applications/sndvol32/dialog.c
index 564a88b8ea..8ff9a490b4 100644
--- a/base/applications/sndvol32/dialog.c
+++ b/base/applications/sndvol32/dialog.c
@@ -414,23 +414,31 @@ EnumConnectionsCallback(
UINT ControlCount = 0, Index;
LPMIXERCONTROL Control = NULL;
HWND hDlgCtrl;
+ PMIXERCONTROLDETAILS_UNSIGNED pVolumeDetails = NULL;
PPREFERENCES_CONTEXT PrefContext = (PPREFERENCES_CONTEXT)Context;
- if (Line->cControls != 0)
+ if (Line->cControls == 0)
+ return TRUE;
+
+ /* get line name */
+ if (SndMixerGetLineName(PrefContext->MixerWindow->Mixer,
PrefContext->SelectedLine, LineName, MIXER_LONG_NAME_CHARS, TRUE) == -1)
+ {
+ /* failed to get line name */
+ LineName[0] = L'\0';
+ }
+
+ pVolumeDetails = HeapAlloc(GetProcessHeap(),
+ 0,
+ Line->cChannels *
sizeof(MIXERCONTROLDETAILS_UNSIGNED));
+ if (pVolumeDetails == NULL)
+ goto done;
+
+ /* check if line is found in registry settings */
+ if (ReadLineConfig(PrefContext->DeviceName,
+ LineName,
+ Line->szName,
+ &Flags))
{
- /* get line name */
- if (SndMixerGetLineName(PrefContext->MixerWindow->Mixer,
PrefContext->SelectedLine, LineName, MIXER_LONG_NAME_CHARS, TRUE) == -1)
- {
- /* failed to get line name */
- LineName[0] = L'\0';
- }
-
- /* check if line is found in registry settings */
- if (ReadLineConfig(PrefContext->DeviceName,
- LineName,
- Line->szName,
- &Flags))
- {
/* is it selected */
if (Flags != 0x4)
{
@@ -462,7 +470,7 @@ EnumConnectionsCallback(
MIXERCONTROLDETAILS_BOOLEAN Details;
/* get volume control details */
- if (SndMixerGetVolumeControlDetails(Mixer,
Control[Index].dwControlID, sizeof(MIXERCONTROLDETAILS_BOOLEAN), (LPVOID)&Details) !=
-1)
+ if (SndMixerGetVolumeControlDetails(Mixer,
Control[Index].dwControlID, 1, sizeof(MIXERCONTROLDETAILS_BOOLEAN), (LPVOID)&Details)
!= -1)
{
/* update dialog control */
wID = (PrefContext->Count + 1) * IDC_LINE_SWITCH;
@@ -483,18 +491,60 @@ EnumConnectionsCallback(
}
else if ((Control[Index].dwControlType &
MIXERCONTROL_CT_CLASS_MASK) == MIXERCONTROL_CT_CLASS_FADER)
{
- MIXERCONTROLDETAILS_UNSIGNED Details;
-
/* get volume control details */
- if (SndMixerGetVolumeControlDetails(Mixer,
Control[Index].dwControlID, sizeof(MIXERCONTROLDETAILS_UNSIGNED), (LPVOID)&Details) !=
-1)
+ if (SndMixerGetVolumeControlDetails(Mixer,
Control[Index].dwControlID, Line->cChannels, sizeof(MIXERCONTROLDETAILS_UNSIGNED),
(LPVOID)pVolumeDetails) != -1)
{
/* update dialog control */
- DWORD Position, Step;
+ DWORD volumePosition, volumeStep, maxVolume, i;
+ DWORD balancePosition, balanceStep;
- Step = (Control[Index].Bounds.dwMaximum -
Control[Index].Bounds.dwMinimum) / (VOLUME_MAX - VOLUME_MIN);
- Position = (Details.dwValue -
Control[Index].Bounds.dwMinimum) / Step;
+ volumeStep = (Control[Index].Bounds.dwMaximum -
Control[Index].Bounds.dwMinimum) / (VOLUME_MAX - VOLUME_MIN);
- /* FIXME support left - right slider */
+ maxVolume = 0;
+ for (i = 0; i < Line->cChannels; i++)
+ {
+ if (pVolumeDetails[i].dwValue > maxVolume)
+ maxVolume = pVolumeDetails[i].dwValue;
+ }
+
+ volumePosition = (maxVolume -
Control[Index].Bounds.dwMinimum) / volumeStep;
+
+ if (Line->cChannels == 1)
+ {
+ balancePosition = BALANCE_CENTER;
+ }
+ else if (Line->cChannels == 2)
+ {
+ if (pVolumeDetails[0].dwValue ==
pVolumeDetails[1].dwValue)
+ {
+ balancePosition = BALANCE_CENTER;
+ }
+ else if (pVolumeDetails[0].dwValue ==
Control[Index].Bounds.dwMinimum)
+ {
+ balancePosition = BALANCE_RIGHT;
+ }
+ else if (pVolumeDetails[1].dwValue ==
Control[Index].Bounds.dwMinimum)
+ {
+ balancePosition = BALANCE_LEFT;
+ }
+ else
+ {
+ balanceStep = (maxVolume -
Control[Index].Bounds.dwMinimum) / (BALANCE_STEPS / 2);
+
+ if (pVolumeDetails[0].dwValue <
pVolumeDetails[1].dwValue)
+ {
+ balancePosition = (pVolumeDetails[0].dwValue -
Control[Index].Bounds.dwMinimum) / balanceStep;
+ balancePosition = BALANCE_RIGHT -
balancePosition;
+ }
+ else if (pVolumeDetails[1].dwValue <
pVolumeDetails[0].dwValue)
+ {
+ balancePosition = (pVolumeDetails[1].dwValue -
Control[Index].Bounds.dwMinimum) / balanceStep;
+ balancePosition = BALANCE_LEFT +
balancePosition;
+ }
+ }
+ }
+
+ /* Set the volume trackbar */
wID = (PrefContext->Count + 1) * IDC_LINE_SLIDER_VERT;
/* get dialog control */
@@ -504,10 +554,29 @@ EnumConnectionsCallback(
{
/* check state */
LRESULT OldPosition = SendMessageW(hDlgCtrl,
TBM_GETPOS, 0, 0);
- if (OldPosition != Position)
+
+ if (OldPosition != (VOLUME_MAX - volumePosition))
{
/* update control state */
- SendMessageW(hDlgCtrl, TBM_SETPOS, (WPARAM)TRUE,
VOLUME_MAX - Position);
+ SendMessageW(hDlgCtrl, TBM_SETPOS, (WPARAM)TRUE,
VOLUME_MAX - volumePosition);
+ }
+ }
+
+ /* Set the balance trackbar */
+ wID = (PrefContext->Count + 1) * IDC_LINE_SLIDER_HORZ;
+
+ /* get dialog control */
+ hDlgCtrl = GetDlgItem(PrefContext->MixerWindow->hWnd,
wID);
+
+ if (hDlgCtrl != NULL)
+ {
+ /* check state */
+ LRESULT OldPosition = SendMessageW(hDlgCtrl,
TBM_GETPOS, 0, 0);
+
+ if (OldPosition != balancePosition)
+ {
+ /* update control state */
+ SendMessageW(hDlgCtrl, TBM_SETPOS, (WPARAM)TRUE,
balancePosition);
}
}
}
@@ -521,8 +590,13 @@ EnumConnectionsCallback(
/* increment dialog count */
PrefContext->Count++;
}
- }
}
+
+done:
+ /* Free the volume details */
+ if (pVolumeDetails)
+ HeapFree(GetProcessHeap(), 0, pVolumeDetails);
+
return TRUE;
}
@@ -611,7 +685,6 @@ VOID
UpdateDialogLineSliderControl(
PPREFERENCES_CONTEXT PrefContext,
LPMIXERLINE Line,
- DWORD dwControlID,
DWORD dwDialogID,
DWORD Position)
{
@@ -648,7 +721,7 @@ UpdateDialogLineSliderControl(
if (OldPosition != Position)
{
/* update control state */
- SendMessageW(hDlgCtrl, TBM_SETPOS, (WPARAM)TRUE, Position + Index);
+ SendMessageW(hDlgCtrl, TBM_SETPOS, (WPARAM)TRUE, Position);
}
}
break;
diff --git a/base/applications/sndvol32/mixer.c b/base/applications/sndvol32/mixer.c
index 768aa658f5..147d3c4f58 100644
--- a/base/applications/sndvol32/mixer.c
+++ b/base/applications/sndvol32/mixer.c
@@ -471,7 +471,7 @@ SndMixerEnumProducts(PSND_MIXER Mixer,
}
INT
-SndMixerSetVolumeControlDetails(PSND_MIXER Mixer, DWORD dwControlID, DWORD cbDetails,
LPVOID paDetails)
+SndMixerSetVolumeControlDetails(PSND_MIXER Mixer, DWORD dwControlID, DWORD cChannels,
DWORD cbDetails, LPVOID paDetails)
{
MIXERCONTROLDETAILS MixerDetails;
@@ -479,7 +479,7 @@ SndMixerSetVolumeControlDetails(PSND_MIXER Mixer, DWORD dwControlID,
DWORD cbDet
{
MixerDetails.cbStruct = sizeof(MIXERCONTROLDETAILS);
MixerDetails.dwControlID = dwControlID;
- MixerDetails.cChannels = 1; //FIXME
+ MixerDetails.cChannels = cChannels;
MixerDetails.cMultipleItems = 0;
MixerDetails.cbDetails = cbDetails;
MixerDetails.paDetails = paDetails;
@@ -495,7 +495,7 @@ SndMixerSetVolumeControlDetails(PSND_MIXER Mixer, DWORD dwControlID,
DWORD cbDet
INT
-SndMixerGetVolumeControlDetails(PSND_MIXER Mixer, DWORD dwControlID, DWORD cbDetails,
LPVOID paDetails)
+SndMixerGetVolumeControlDetails(PSND_MIXER Mixer, DWORD dwControlID, DWORD cChannels,
DWORD cbDetails, LPVOID paDetails)
{
MIXERCONTROLDETAILS MixerDetails;
@@ -503,7 +503,7 @@ SndMixerGetVolumeControlDetails(PSND_MIXER Mixer, DWORD dwControlID,
DWORD cbDet
{
MixerDetails.cbStruct = sizeof(MIXERCONTROLDETAILS);
MixerDetails.dwControlID = dwControlID;
- MixerDetails.cChannels = 1; //FIXME
+ MixerDetails.cChannels = cChannels;
MixerDetails.cMultipleItems = 0;
MixerDetails.cbDetails = cbDetails;
MixerDetails.paDetails = paDetails;
diff --git a/base/applications/sndvol32/sndvol32.c
b/base/applications/sndvol32/sndvol32.c
index 592323e51b..864228e47e 100644
--- a/base/applications/sndvol32/sndvol32.c
+++ b/base/applications/sndvol32/sndvol32.c
@@ -663,7 +663,7 @@ SetVolumeCallback(PSND_MIXER Mixer, DWORD LineID, LPMIXERLINE Line,
PVOID Ctx)
uDetails.dwValue = ((VOLUME_MAX - Context->SliderPos) * Step) +
Control[Index].Bounds.dwMinimum;
/* set volume */
- SndMixerSetVolumeControlDetails(Preferences.MixerWindow->Mixer,
Control[Index].dwControlID, sizeof(MIXERCONTROLDETAILS_UNSIGNED), (LPVOID)&uDetails);
+ SndMixerSetVolumeControlDetails(Preferences.MixerWindow->Mixer,
Control[Index].dwControlID, 1, sizeof(MIXERCONTROLDETAILS_UNSIGNED),
(LPVOID)&uDetails);
/* done */
break;
@@ -677,7 +677,7 @@ SetVolumeCallback(PSND_MIXER Mixer, DWORD LineID, LPMIXERLINE Line,
PVOID Ctx)
bDetails.fValue = Context->SliderPos;
/* set volume */
- SndMixerSetVolumeControlDetails(Preferences.MixerWindow->Mixer,
Control[Index].dwControlID, sizeof(MIXERCONTROLDETAILS_BOOLEAN), (LPVOID)&bDetails);
+ SndMixerSetVolumeControlDetails(Preferences.MixerWindow->Mixer,
Control[Index].dwControlID, 1, sizeof(MIXERCONTROLDETAILS_BOOLEAN),
(LPVOID)&bDetails);
/* done */
break;
@@ -703,6 +703,7 @@ BOOL
CALLBACK
MixerControlChangeCallback(PSND_MIXER Mixer, DWORD LineID, LPMIXERLINE Line, PVOID
Context)
{
+ PMIXERCONTROLDETAILS_UNSIGNED pVolumeDetails = NULL;
UINT ControlCount = 0, Index;
LPMIXERCONTROL Control = NULL;
@@ -720,6 +721,12 @@ MixerControlChangeCallback(PSND_MIXER Mixer, DWORD LineID,
LPMIXERLINE Line, PVO
return FALSE;
}
+ pVolumeDetails = HeapAlloc(GetProcessHeap(),
+ 0,
+ Line->cChannels *
sizeof(MIXERCONTROLDETAILS_UNSIGNED));
+ if (pVolumeDetails == NULL)
+ goto done;
+
/* now go through all controls and compare control ids */
for (Index = 0; Index < ControlCount; Index++)
{
@@ -730,7 +737,7 @@ MixerControlChangeCallback(PSND_MIXER Mixer, DWORD LineID, LPMIXERLINE
Line, PVO
MIXERCONTROLDETAILS_BOOLEAN Details;
/* get volume control details */
- if (SndMixerGetVolumeControlDetails(Preferences.MixerWindow->Mixer,
Control[Index].dwControlID, sizeof(MIXERCONTROLDETAILS_BOOLEAN), (LPVOID)&Details) !=
-1)
+ if (SndMixerGetVolumeControlDetails(Preferences.MixerWindow->Mixer,
Control[Index].dwControlID, 1, sizeof(MIXERCONTROLDETAILS_BOOLEAN), (LPVOID)&Details)
!= -1)
{
/* update dialog control */
UpdateDialogLineSwitchControl(&Preferences, Line,
Details.fValue);
@@ -738,25 +745,75 @@ MixerControlChangeCallback(PSND_MIXER Mixer, DWORD LineID,
LPMIXERLINE Line, PVO
}
else if ((Control[Index].dwControlType & MIXERCONTROL_CT_CLASS_MASK) ==
MIXERCONTROL_CT_CLASS_FADER)
{
- MIXERCONTROLDETAILS_UNSIGNED Details;
-
/* get volume control details */
- if (SndMixerGetVolumeControlDetails(Preferences.MixerWindow->Mixer,
Control[Index].dwControlID, sizeof(MIXERCONTROLDETAILS_UNSIGNED), (LPVOID)&Details) !=
-1)
+ if (SndMixerGetVolumeControlDetails(Preferences.MixerWindow->Mixer,
Control[Index].dwControlID, Line->cChannels, sizeof(MIXERCONTROLDETAILS_UNSIGNED),
(LPVOID)pVolumeDetails) != -1)
{
/* update dialog control */
- DWORD Position, Step;
+ DWORD volumePosition, volumeStep, maxVolume, i;
+ DWORD balancePosition, balanceStep;
+
+ volumeStep = (Control[Index].Bounds.dwMaximum -
Control[Index].Bounds.dwMinimum) / (VOLUME_MAX - VOLUME_MIN);
+
+ maxVolume = 0;
+ for (i = 0; i < Line->cChannels; i++)
+ {
+ if (pVolumeDetails[i].dwValue > maxVolume)
+ maxVolume = pVolumeDetails[i].dwValue;
+ }
+
+ volumePosition = (maxVolume - Control[Index].Bounds.dwMinimum) /
volumeStep;
+
+ if (Line->cChannels == 1)
+ {
+ balancePosition = BALANCE_CENTER;
+ }
+ else if (Line->cChannels == 2)
+ {
+ if (pVolumeDetails[0].dwValue == pVolumeDetails[1].dwValue)
+ {
+ balancePosition = BALANCE_CENTER;
+ }
+ else if (pVolumeDetails[0].dwValue ==
Control[Index].Bounds.dwMinimum)
+ {
+ balancePosition = BALANCE_RIGHT;
+ }
+ else if (pVolumeDetails[1].dwValue ==
Control[Index].Bounds.dwMinimum)
+ {
+ balancePosition = BALANCE_LEFT;
+ }
+ else
+ {
+ balanceStep = (maxVolume - Control[Index].Bounds.dwMinimum) /
(BALANCE_STEPS / 2);
+
+ if (pVolumeDetails[0].dwValue <
pVolumeDetails[1].dwValue)
+ {
+ balancePosition = (pVolumeDetails[0].dwValue -
Control[Index].Bounds.dwMinimum) / balanceStep;
+ balancePosition = BALANCE_RIGHT - balancePosition;
+ }
+ else if (pVolumeDetails[1].dwValue <
pVolumeDetails[0].dwValue)
+ {
+ balancePosition = (pVolumeDetails[1].dwValue -
Control[Index].Bounds.dwMinimum) / balanceStep;
+ balancePosition = BALANCE_LEFT + balancePosition;
+ }
+ }
+ }
- Step = (Control[Index].Bounds.dwMaximum -
Control[Index].Bounds.dwMinimum) / (VOLUME_MAX - VOLUME_MIN);
- Position = (Details.dwValue - Control[Index].Bounds.dwMinimum) /
Step;
+ /* Update the volume control slider */
+ UpdateDialogLineSliderControl(&Preferences, Line,
IDC_LINE_SLIDER_VERT, VOLUME_MAX - volumePosition);
- /* update volume control slider */
- UpdateDialogLineSliderControl(&Preferences, Line,
Control[Index].dwControlID, IDC_LINE_SLIDER_VERT, VOLUME_MAX - Position);
+ /* Update the balance control slider */
+ UpdateDialogLineSliderControl(&Preferences, Line,
IDC_LINE_SLIDER_HORZ, balancePosition);
}
}
break;
}
}
+done:
+ /* Free the volume details */
+ if (pVolumeDetails)
+ HeapFree(GetProcessHeap(), 0, pVolumeDetails);
+
/* free controls */
HeapFree(GetProcessHeap(), 0, Control);
diff --git a/base/applications/sndvol32/sndvol32.h
b/base/applications/sndvol32/sndvol32.h
index a68cb37778..cf20366480 100644
--- a/base/applications/sndvol32/sndvol32.h
+++ b/base/applications/sndvol32/sndvol32.h
@@ -18,6 +18,9 @@
#define VOLUME_MAX 500
#define VOLUME_TICKS 5
#define VOLUME_PAGE_SIZE 100
+#define BALANCE_LEFT 0
+#define BALANCE_CENTER 32
+#define BALANCE_RIGHT 64
#define BALANCE_STEPS 64
#define BALANCE_TICKS 1
#define BALANCE_PAGE_SIZE 12
@@ -104,14 +107,13 @@ typedef struct _PREFERENCES_CONTEXT
DWORD tmp;
} PREFERENCES_CONTEXT, *PPREFERENCES_CONTEXT;
-typedef struct
+typedef struct _SET_VOLUME_CONTEXT
{
WCHAR LineName[MIXER_LONG_NAME_CHARS];
UINT SliderPos;
BOOL bVertical;
BOOL bSwitch;
-
-}SET_VOLUME_CONTEXT, *PSET_VOLUME_CONTEXT;
+} SET_VOLUME_CONTEXT, *PSET_VOLUME_CONTEXT;
/* NOTE: do NOT modify SNDVOL_REG_LINESTATE for binary compatibility with XP! */
typedef struct _SNDVOL_REG_LINESTATE
@@ -130,8 +132,8 @@ VOID SndMixerDestroy(PSND_MIXER Mixer);
VOID SndMixerClose(PSND_MIXER Mixer);
BOOL SndMixerSelect(PSND_MIXER Mixer, UINT MixerId);
UINT SndMixerGetSelection(PSND_MIXER Mixer);
-INT SndMixerSetVolumeControlDetails(PSND_MIXER Mixer, DWORD dwControlID, DWORD cbDetails,
LPVOID paDetails);
-INT SndMixerGetVolumeControlDetails(PSND_MIXER Mixer, DWORD dwControlID, DWORD cbDetails,
LPVOID paDetails);
+INT SndMixerSetVolumeControlDetails(PSND_MIXER Mixer, DWORD dwControlID, DWORD cChannels,
DWORD cbDetails, LPVOID paDetails);
+INT SndMixerGetVolumeControlDetails(PSND_MIXER Mixer, DWORD dwControlID, DWORD cChannels,
DWORD cbDetails, LPVOID paDetails);
INT SndMixerGetProductName(PSND_MIXER Mixer, LPTSTR lpBuffer, UINT uSize);
INT SndMixerGetLineName(PSND_MIXER Mixer, DWORD LineID, LPTSTR lpBuffer, UINT uSize, BOOL
LongName);
BOOL SndMixerEnumProducts(PSND_MIXER Mixer, PFNSNDMIXENUMPRODUCTS EnumProc, PVOID
Context);
@@ -145,7 +147,7 @@ BOOL SndMixerQueryControls(PSND_MIXER Mixer, PUINT DisplayControls,
LPMIXERLINE
* dialog.c
*/
VOID LoadDialogCtrls(PPREFERENCES_CONTEXT PrefContext);
-VOID UpdateDialogLineSliderControl(PPREFERENCES_CONTEXT PrefContext, LPMIXERLINE Line,
DWORD dwControlID, DWORD DialogID, DWORD Position);
+VOID UpdateDialogLineSliderControl(PPREFERENCES_CONTEXT PrefContext, LPMIXERLINE Line,
DWORD DialogID, DWORD Position);
VOID UpdateDialogLineSwitchControl(PPREFERENCES_CONTEXT PrefContext, LPMIXERLINE Line,
LONG fValue);
/*