PPREFERENCES_CONTEXT PrefContext = (PPREFERENCES_CONTEXT)Context;
UNREFERENCED_PARAMETER(Mixer);
- UNREFERENCED_PARAMETER(DisplayControls);
+ UNREFERENCED_PARAMETER(DisplayControls);
switch (Line->dwComponentType)
{
UINT i;
UNREFERENCED_PARAMETER(Mixer);
- UNREFERENCED_PARAMETER(LineID);
+ UNREFERENCED_PARAMETER(LineID);
if (Line->cControls != 0)
{
return 0;
}
-
/******************************************************************************/
static VOID
{
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;
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++)
{
if (Context->bVertical)
{
- if ((Control[Index].dwControlType & MIXERCONTROL_CT_CLASS_MASK) == MIXERCONTROL_CT_CLASS_FADER)
+ if (Control[Index].dwControlType == MIXERCONTROL_CONTROLTYPE_VOLUME)
{
- 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, sizeof(MIXERCONTROLDETAILS_UNSIGNED), (LPVOID)&uDetails);
+ SndMixerSetVolumeControlDetails(Preferences.MixerWindow->Mixer, Control[Index].dwControlID, Line->cChannels, sizeof(MIXERCONTROLDETAILS_UNSIGNED), (LPVOID)puDetails);
/* done */
break;
}
else if (Context->bSwitch)
{
- if ((Control[Index].dwControlType & MIXERCONTROL_CT_CLASS_MASK) == MIXERCONTROL_CT_CLASS_SWITCH)
+ if (Control[Index].dwControlType == MIXERCONTROL_CONTROLTYPE_MUTE)
{
/* set up details */
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;
}
}
- else
- {
- /* FIXME: implement left - right channel switch support */
- assert(0);
- }
}
+ if (puDetails != NULL)
+ HeapFree(GetProcessHeap(), 0, puDetails);
+
/* free controls */
HeapFree(GetProcessHeap(), 0, Control);
CALLBACK
MixerControlChangeCallback(PSND_MIXER Mixer, DWORD LineID, LPMIXERLINE Line, PVOID Context)
{
+ PMIXERCONTROLDETAILS_UNSIGNED pVolumeDetails = NULL;
UINT ControlCount = 0, Index;
LPMIXERCONTROL Control = NULL;
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++)
{
if (Control[Index].dwControlID == PtrToUlong(Context))
{
- if ((Control[Index].dwControlType & MIXERCONTROL_CT_CLASS_MASK) == MIXERCONTROL_CT_CLASS_SWITCH)
+ if (Control[Index].dwControlType == MIXERCONTROL_CONTROLTYPE_MUTE)
{
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);
}
}
- else if ((Control[Index].dwControlType & MIXERCONTROL_CT_CLASS_MASK) == MIXERCONTROL_CT_CLASS_FADER)
+ else if (Control[Index].dwControlType == MIXERCONTROL_CONTROLTYPE_VOLUME)
{
- 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;
+ }
- Step = (Control[Index].Bounds.dwMaximum - Control[Index].Bounds.dwMinimum) / (VOLUME_MAX - VOLUME_MIN);
- Position = (Details.dwValue - Control[Index].Bounds.dwMinimum) / Step;
+ volumePosition = (maxVolume - Control[Index].Bounds.dwMinimum) / volumeStep;
- /* update volume control slider */
- UpdateDialogLineSliderControl(&Preferences, Line, Control[Index].dwControlID, IDC_LINE_SLIDER_VERT, VOLUME_MAX - Position);
+ 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;
+ }
+ }
+ }
+
+ /* Update the volume control slider */
+ UpdateDialogLineSliderControl(&Preferences, Line, IDC_LINE_SLIDER_VERT, VOLUME_MAX - volumePosition);
+
+ /* 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);
return TRUE;
}
-
static LRESULT CALLBACK
MainWindowProc(HWND hwnd,
UINT uMsg,
switch (LOWORD(wParam))
{
- case IDC_PROPERTIES:
+ case IDM_PROPERTIES:
{
PREFERENCES_CONTEXT Pref;
/* use new selected mixer */
Preferences.MixerWindow->Mixer = Pref.Mixer;
- /* rebuild dialog controls */
- RebuildMixerWindowControls(&Preferences);
-
/* create status window */
if (MixerWindow->Mode == NORMAL_MODE)
{
(LPARAM)szProduct);
}
}
+
+ /* rebuild dialog controls */
+ RebuildMixerWindowControls(&Preferences);
}
break;
}
- case IDC_EXIT:
+ case IDM_ADVANCED_CONTROLS:
+ MixerWindow->bShowExtendedControls = !MixerWindow->bShowExtendedControls;
+ CheckMenuItem(GetMenu(hwnd),
+ IDM_ADVANCED_CONTROLS,
+ MF_BYCOMMAND | (MixerWindow->bShowExtendedControls ? MF_CHECKED : MF_UNCHECKED));
+ RebuildMixerWindowControls(&Preferences);
+ break;
+
+ case IDM_EXIT:
{
PostQuitMessage(0);
break;
}
- case IDC_ABOUT:
+ case IDM_ABOUT:
{
HICON hAppIcon = (HICON)GetClassLongPtrW(hwnd,
GCLP_HICON);
CtrlID = LOWORD(wParam);
/* check if the message is from the line switch */
- if (HIWORD(wParam) == BN_CLICKED && (CtrlID % IDC_LINE_SWITCH == 0))
+ if (HIWORD(wParam) == BN_CLICKED)
{
- /* compute line offset */
- LineOffset = CtrlID / IDC_LINE_SWITCH;
-
- /* 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 = SendMessage((HWND)lParam, BM_GETCHECK, 0, 0);
- Context.bVertical = FALSE;
- Context.bSwitch = TRUE;
-
- /* set volume */
- SndMixerEnumConnections(Preferences.MixerWindow->Mixer, Preferences.SelectedLine, SetVolumeCallback, (LPVOID)&Context);
- }
+ if (CtrlID % IDC_LINE_SWITCH == 0)
+ {
+ /* compute line offset */
+ LineOffset = CtrlID / IDC_LINE_SWITCH;
+
+ /* compute window id of line name static control */
+ CtrlID = LineOffset * IDC_LINE_NAME;
+
+ if (Preferences.MixerWindow->Mixer->MixerId == PLAY_MIXER)
+ {
+ /* get line name */
+ if (GetDlgItemTextW(hwnd, CtrlID, Context.LineName, MIXER_LONG_NAME_CHARS) != 0)
+ {
+ /* setup context */
+ Context.SliderPos = SendMessage((HWND)lParam, BM_GETCHECK, 0, 0);
+ Context.bVertical = FALSE;
+ Context.bSwitch = TRUE;
+
+ /* set volume */
+ SndMixerEnumConnections(Preferences.MixerWindow->Mixer, Preferences.SelectedLine, SetVolumeCallback, (LPVOID)&Context);
+ }
+ }
+ else if (Preferences.MixerWindow->Mixer->MixerId == RECORD_MIXER)
+ {
+ UINT i;
+
+ for (i = 0; i < Preferences.MixerWindow->DialogCount; i++)
+ {
+ SendDlgItemMessageW(hwnd, (i + 1) * IDC_LINE_SWITCH, BM_SETCHECK, (WPARAM)((i + 1) == LineOffset), 0);
+ }
+ }
+ }
+ else if (CtrlID % IDC_LINE_ADVANCED == 0)
+ {
+ ADVANCED_CONTEXT AdvancedContext;
+
+ /* compute line offset */
+ LineOffset = CtrlID / IDC_LINE_ADVANCED;
+
+ /* compute window id of line name static control */
+ CtrlID = LineOffset * IDC_LINE_NAME;
+
+ /* get line name */
+ if (GetDlgItemTextW(hwnd, CtrlID, AdvancedContext.LineName, MIXER_LONG_NAME_CHARS) != 0)
+ {
+ AdvancedContext.MixerWindow = Preferences.MixerWindow;
+ AdvancedContext.Mixer = Preferences.MixerWindow->Mixer;
+ AdvancedContext.Line = SndMixerGetLineByName(Preferences.MixerWindow->Mixer,
+ Preferences.SelectedLine,
+ AdvancedContext.LineName);
+ if (AdvancedContext.Line)
+ {
+ DialogBoxParam(hAppInstance,
+ MAKEINTRESOURCE(IDD_ADVANCED),
+ hwnd,
+ AdvancedDlgProc,
+ (LPARAM)&AdvancedContext);
+ }
+ }
+ }
}
}
-
}
break;
}
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;
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:
/* copy product */
wcscpy(Preferences.DeviceName, szProduct);
- if (!RebuildMixerWindowControls(&Preferences))
- {
- DPRINT("Rebuilding mixer window controls failed!\n");
- SndMixerDestroy(MixerWindow->Mixer);
- MixerWindow->Mixer = NULL;
- Result = -1;
- }
+ /* Disable the 'Advanced Controls' menu item */
+ EnableMenuItem(GetMenu(hwnd), IDM_ADVANCED_CONTROLS, MF_BYCOMMAND | MF_GRAYED);
/* create status window */
if (MixerWindow->Mode == NORMAL_MODE)
(LPARAM)szProduct);
}
}
+
+ if (!RebuildMixerWindowControls(&Preferences))
+ {
+ DPRINT("Rebuilding mixer window controls failed!\n");
+ SndMixerDestroy(MixerWindow->Mixer);
+ MixerWindow->Mixer = NULL;
+ Result = -1;
+ }
}
break;
}
static
BOOL
HandleCommandLine(LPTSTR cmdline,
+ DWORD dwStyle,
PWINDOW_MODE pMode,
PUINT pMixerId)
{
TCHAR option;
- *pMixerId = 0;
- *pMode = SMALL_MODE;
+ *pMixerId = PLAY_MIXER;
+ *pMode = (dwStyle & 0x20) ? SMALL_MODE : NORMAL_MODE;
while (*cmdline == _T(' ') || *cmdline == _T('-') || *cmdline == _T('/'))
{
case 'D':
break;
- case 'n': /* Normal size */
+ case 'n': /* Small size */
case 'N':
*pMode = NORMAL_MODE;
break;
case 'p': /* Play mode */
case 'P':
- *pMixerId = 0;
+ *pMixerId = PLAY_MIXER;
break;
case 'r': /* Record mode */
case 'R':
- *pMixerId = 1;
+ *pMixerId = RECORD_MIXER;
break;
default:
INITCOMMONCONTROLSEX Controls;
WINDOW_MODE WindowMode = SMALL_MODE;
UINT MixerId = 0;
+ DWORD dwStyle;
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(nCmdShow);
hAppInstance = hInstance;
hAppHeap = GetProcessHeap();
- HandleCommandLine(lpszCmdLine, &WindowMode, &MixerId);
-
if (InitAppConfig())
{
+ dwStyle = GetStyleValue();
+ HandleCommandLine(lpszCmdLine, dwStyle, &WindowMode, &MixerId);
+
/* load the application title */
if (!AllocAndLoadString(&lpAppTitle,
hAppInstance,