1961 lines
47 KiB
C
1961 lines
47 KiB
C
//==========================================================================;
|
|
//
|
|
// cpl.c
|
|
//
|
|
// Copyright (c) 1991-1998 Microsoft Corporation
|
|
//
|
|
// Description:
|
|
//
|
|
//
|
|
// History:
|
|
// 11/16/92 cjp [curtisp]
|
|
//
|
|
//==========================================================================;
|
|
|
|
#include <windows.h>
|
|
#include <windowsx.h>
|
|
#include <mmsystem.h>
|
|
#include <mmddk.h>
|
|
#include <mmreg.h>
|
|
#include <msacm.h>
|
|
#include <msacmdrv.h>
|
|
#if (WINVER >= 0x0400)
|
|
#define NOSTATUSBAR
|
|
#endif
|
|
#include <cpl.h>
|
|
#include <stdlib.h>
|
|
|
|
|
|
#define WM_ACMMAP_ACM_NOTIFY (WM_USER + 100)
|
|
|
|
|
|
|
|
#if (WINVER >= 0x0400)
|
|
#pragma message("----when chicago fixes their header files, remove this stuff")
|
|
#include <memory.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" // assume C declarations for C++
|
|
{
|
|
#endif // __cplusplus
|
|
|
|
#pragma message("----Using Chicago Interface!")
|
|
#define BEGIN_INTERFACE
|
|
////////#include <shellapi.h>
|
|
#include <shell.h>
|
|
#ifdef WIN32
|
|
#include <shlobj.h>
|
|
#else
|
|
#include <ole2.h>
|
|
#include <prsht.h>
|
|
#endif
|
|
#include <setupx.h>
|
|
|
|
#ifdef __cplusplus
|
|
} // end of extern "C" {
|
|
#endif // __cplusplus */
|
|
|
|
#include "msacmhlp.h"
|
|
|
|
LRESULT PASCAL CPLSendNotify(HWND hDlg, int idFrom, int code);
|
|
#endif
|
|
|
|
#include "msacmmap.h"
|
|
#include "debug.h"
|
|
|
|
|
|
|
|
|
|
//
|
|
//
|
|
//
|
|
//
|
|
typedef struct tACMDRIVERSETTINGS
|
|
{
|
|
HACMDRIVERID hadid;
|
|
DWORD fdwSupport;
|
|
DWORD dwPriority;
|
|
|
|
} ACMDRIVERSETTINGS, FAR *LPACMDRIVERSETTINGS;
|
|
|
|
// A global structure for keeping out cancel variables.
|
|
struct
|
|
{
|
|
BOOL fPreferredOnly;
|
|
UINT uIdPreferredIn;
|
|
UINT uIdPreferredOut;
|
|
|
|
LPACMDRIVERSETTINGS pads;
|
|
} CPLSettings;
|
|
|
|
|
|
#if (WINVER >= 0x0400)
|
|
TCHAR BCODE gszCPLHelp[] = TEXT("MAPPER.HLP");
|
|
|
|
int BCODE ganKeywordIds[] =
|
|
{
|
|
IDD_CPL_LIST_DRIVERS, IDH_AUDIOCOMP_DRIVER,
|
|
IDD_CPL_COMBO_PLAYBACK, IDH_AUDIOCOMP_PLAYBACK,
|
|
IDD_CPL_COMBO_RECORD, IDH_AUDIOCOMP_RECORDING,
|
|
IDD_CPL_CHECK_PREFERRED, IDH_AUDIOCOMP_PREFERRED,
|
|
IDD_CPL_BTN_CONFIGURE, IDH_PRIORITY_CHANGE,
|
|
IDD_CPL_BTN_PRIORITY, IDH_PRIORITY_DISABLE,
|
|
|
|
0, 0
|
|
};
|
|
|
|
TCHAR BCODE gszClass[] = TEXT("Media");
|
|
TCHAR BCODE gszClassStr[] = TEXT("Class");
|
|
TCHAR BCODE gszACMClass[] = TEXT("ACM");
|
|
|
|
#else
|
|
|
|
#if defined(WIN32) && !defined(WIN4)
|
|
//
|
|
// Daytona help. The number 5123 is taken from
|
|
// \nt\private\windows\shell\control\main\cphelp.h. If you change this
|
|
// value, you gotta change it here, there, and also in the appropriate
|
|
// .hpj file (control.hpj?) in the Daytona help project.
|
|
//
|
|
#define USE_DAYTONA_HELP
|
|
#define IDH_CHILD_MSACM 5123
|
|
const TCHAR gszCPLHelp[] = TEXT("CONTROL.HLP");
|
|
|
|
#else
|
|
TCHAR BCODE gszCPLHelp[] = TEXT("MAP_WIN.HLP");
|
|
#endif
|
|
#endif
|
|
|
|
TCHAR BCODE gszFormatDriverDesc[] = TEXT("%lu\t%s\t%s");
|
|
TCHAR BCODE gszFormatNumber[] = TEXT("%lu");
|
|
|
|
|
|
//
|
|
// this string variable must be large enough to hold the IDS_TXT_DISABLED
|
|
// resource string.. for USA, this is '(disabled)'--which is 11 bytes
|
|
// including the NULL terminator.
|
|
//
|
|
TCHAR gszDisabled[32];
|
|
HACMDRIVERID ghadidNotify;
|
|
|
|
|
|
//
|
|
//
|
|
//
|
|
#define CONTROL_MAX_ITEM_CHARS (10 + 1 + 32 + 1 + ACMDRIVERDETAILS_LONGNAME_CHARS)
|
|
|
|
|
|
//==========================================================================;
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//==========================================================================;
|
|
|
|
//--------------------------------------------------------------------------;
|
|
//
|
|
// void ControlApplySettings
|
|
//
|
|
// Description:
|
|
//
|
|
//
|
|
// Arguments:
|
|
// HWND hwnd:
|
|
//
|
|
// Return (void):
|
|
//
|
|
// History:
|
|
// 09/08/93 cjp [curtisp]
|
|
//
|
|
//--------------------------------------------------------------------------;
|
|
|
|
void FNLOCAL ControlApplySettings
|
|
(
|
|
HWND hwnd
|
|
)
|
|
{
|
|
MMRESULT mmr;
|
|
HWND hlb;
|
|
HWND hcb;
|
|
UINT cDrivers;
|
|
LPACMDRIVERSETTINGS pads;
|
|
UINT u;
|
|
BOOL fDisabled;
|
|
DWORD fdwPriority;
|
|
|
|
|
|
//
|
|
// Flush priority changes.
|
|
//
|
|
hlb = GetDlgItem(hwnd, IDD_CPL_LIST_DRIVERS);
|
|
|
|
cDrivers = (UINT)ListBox_GetCount(hlb);
|
|
if (LB_ERR == cDrivers)
|
|
return;
|
|
|
|
//
|
|
//
|
|
//
|
|
mmr = acmDriverPriority(NULL, 0L, ACM_DRIVERPRIORITYF_BEGIN);
|
|
if (MMSYSERR_NOERROR != mmr)
|
|
{
|
|
DPF(0, "!ControlApplySettings: acmDriverPriority(end) failed! mmr=%u", mmr);
|
|
return;
|
|
}
|
|
|
|
for (u = 0; u < cDrivers; u++)
|
|
{
|
|
pads = (LPACMDRIVERSETTINGS)ListBox_GetItemData(hlb, u);
|
|
if (NULL == pads)
|
|
{
|
|
DPF(0, "!ControlApplySettings: NULL item data for driver index=%u!", u);
|
|
continue;
|
|
}
|
|
|
|
fDisabled = (0 != (ACMDRIVERDETAILS_SUPPORTF_DISABLED & pads->fdwSupport));
|
|
|
|
fdwPriority = fDisabled ? ACM_DRIVERPRIORITYF_DISABLE : ACM_DRIVERPRIORITYF_ENABLE;
|
|
|
|
mmr = acmDriverPriority(pads->hadid, pads->dwPriority, fdwPriority);
|
|
if (MMSYSERR_NOERROR != mmr)
|
|
{
|
|
DPF(0, "!ControlApplySettings: acmDriverPriority(%.04Xh, %lu, %.08lXh) failed! mmr=%u",
|
|
pads->hadid, pads->dwPriority, fdwPriority, mmr);
|
|
}
|
|
}
|
|
|
|
mmr = acmDriverPriority(NULL, 0L, ACM_DRIVERPRIORITYF_END);
|
|
if (MMSYSERR_NOERROR != mmr)
|
|
{
|
|
DPF(0, "!ControlApplySettings: acmDriverPriority(end) failed! mmr=%u", mmr);
|
|
}
|
|
|
|
|
|
//
|
|
// update mapper preference changes
|
|
//
|
|
|
|
WAIT_FOR_MUTEX(gpag->hMutexSettings);
|
|
|
|
gpag->pSettings->fPreferredOnly = CPLSettings.fPreferredOnly;
|
|
gpag->pSettings->uIdPreferredIn = CPLSettings.uIdPreferredIn;
|
|
gpag->pSettings->uIdPreferredOut = CPLSettings.uIdPreferredOut;
|
|
|
|
hcb = GetDlgItem(hwnd, IDD_CPL_COMBO_RECORD);
|
|
u = (UINT)ComboBox_GetCurSel(hcb);
|
|
ComboBox_GetLBText(hcb, u, (LPARAM)(LPVOID)gpag->pSettings->szPreferredWaveIn);
|
|
|
|
hcb = GetDlgItem(hwnd, IDD_CPL_COMBO_PLAYBACK);
|
|
u = (UINT)ComboBox_GetCurSel(hcb);
|
|
ComboBox_GetLBText(hcb, u, (LPARAM)(LPVOID)gpag->pSettings->szPreferredWaveOut);
|
|
|
|
RELEASE_MUTEX(gpag->hMutexSettings);
|
|
|
|
|
|
//
|
|
//
|
|
//
|
|
mapSettingsSave();
|
|
} // ControlApplySettings()
|
|
|
|
|
|
//==========================================================================;
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//==========================================================================;
|
|
|
|
//--------------------------------------------------------------------------;
|
|
//
|
|
// BOOL DlgProcACMRestart
|
|
//
|
|
// Description:
|
|
//
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Return (BOOL):
|
|
//
|
|
//
|
|
// History:
|
|
// 11/16/92 cjp [curtisp]
|
|
//
|
|
//--------------------------------------------------------------------------;
|
|
|
|
BOOL FNCALLBACK DlgProcACMRestart
|
|
(
|
|
HWND hwnd,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
UINT uCmdId;
|
|
|
|
switch (uMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
return (TRUE);
|
|
|
|
case WM_COMMAND:
|
|
uCmdId = GET_WM_COMMAND_ID(wParam, lParam);
|
|
|
|
if ((uCmdId == IDOK) || (uCmdId == IDCANCEL))
|
|
EndDialog(hwnd, uCmdId == IDOK);
|
|
return (TRUE);
|
|
}
|
|
|
|
return (FALSE);
|
|
} // DlgProcACMRestart()
|
|
|
|
|
|
//--------------------------------------------------------------------------;
|
|
//
|
|
// BOOL DlgProcACMAboutBox
|
|
//
|
|
// Description:
|
|
//
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Return (BOOL):
|
|
//
|
|
//
|
|
// History:
|
|
// 11/16/92 cjp [curtisp]
|
|
//
|
|
//--------------------------------------------------------------------------;
|
|
|
|
BOOL FNCALLBACK DlgProcACMAboutBox
|
|
(
|
|
HWND hwnd,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
TCHAR ach[80];
|
|
TCHAR szFormat[80];
|
|
LPACMDRIVERDETAILS padd;
|
|
DWORD dw1;
|
|
DWORD dw2;
|
|
UINT uCmdId;
|
|
HFONT hfont;
|
|
HWND htxt;
|
|
|
|
switch (uMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
padd = (LPACMDRIVERDETAILS)lParam;
|
|
if (NULL == padd)
|
|
{
|
|
DPF(0, "!DlgProcACMAboutBox: NULL driver details passed!");
|
|
return (TRUE);
|
|
}
|
|
|
|
#ifdef JAPAN
|
|
hfont = GetStockFont(SYSTEM_FIXED_FONT);
|
|
#else
|
|
hfont = GetStockFont(ANSI_VAR_FONT);
|
|
#endif
|
|
|
|
|
|
//
|
|
// fill in all the static text controls with the long info
|
|
// returned from the driver
|
|
//
|
|
LoadString(gpag->hinst, IDS_ABOUT_TITLE, szFormat, SIZEOF(szFormat));
|
|
wsprintf(ach, szFormat, (LPTSTR)padd->szShortName);
|
|
SetWindowText(hwnd, ach);
|
|
|
|
//
|
|
// if the driver supplies an icon, then use it..
|
|
//
|
|
if (NULL != padd->hicon)
|
|
{
|
|
Static_SetIcon(GetDlgItem(hwnd, IDD_ABOUT_ICON_DRIVER), padd->hicon);
|
|
}
|
|
|
|
htxt = GetDlgItem(hwnd, IDD_ABOUT_TXT_DESCRIPTION);
|
|
SetWindowFont(htxt, hfont, FALSE);
|
|
SetWindowText(htxt, padd->szLongName);
|
|
|
|
dw1 = padd->vdwACM;
|
|
dw2 = padd->vdwDriver;
|
|
LoadString(gpag->hinst, IDS_ABOUT_VERSION, szFormat, SIZEOF(szFormat));
|
|
#ifdef DEBUG
|
|
wsprintf(ach, szFormat, HIWORD(dw2) >> 8, (BYTE)HIWORD(dw2), LOWORD(dw2),
|
|
HIWORD(dw1) >> 8, (BYTE)HIWORD(dw1), LOWORD(dw1));
|
|
#else
|
|
wsprintf(ach, szFormat, HIWORD(dw2) >> 8, (BYTE)HIWORD(dw2),
|
|
HIWORD(dw1) >> 8, (BYTE)HIWORD(dw1));
|
|
#endif
|
|
htxt = GetDlgItem(hwnd, IDD_ABOUT_TXT_VERSION);
|
|
SetWindowFont(htxt, hfont, FALSE);
|
|
SetWindowText(htxt, ach);
|
|
|
|
htxt = GetDlgItem(hwnd, IDD_ABOUT_TXT_COPYRIGHT);
|
|
SetWindowFont(htxt, hfont, FALSE);
|
|
SetWindowText(htxt, padd->szCopyright);
|
|
|
|
htxt = GetDlgItem(hwnd, IDD_ABOUT_TXT_LICENSING);
|
|
SetWindowFont(htxt, hfont, FALSE);
|
|
SetWindowText(htxt, padd->szLicensing);
|
|
|
|
htxt = GetDlgItem(hwnd, IDD_ABOUT_TXT_FEATURES);
|
|
SetWindowFont(htxt, hfont, FALSE);
|
|
SetWindowText(htxt, padd->szFeatures);
|
|
return (TRUE);
|
|
|
|
|
|
case WM_COMMAND:
|
|
uCmdId = GET_WM_COMMAND_ID(wParam,lParam);
|
|
|
|
if ((uCmdId == IDOK) || (uCmdId == IDCANCEL))
|
|
EndDialog(hwnd, wParam == uCmdId);
|
|
return (TRUE);
|
|
}
|
|
|
|
return (FALSE);
|
|
} // DlgProcACMAboutBox()
|
|
|
|
|
|
//--------------------------------------------------------------------------;
|
|
//
|
|
// void ControlAboutDriver
|
|
//
|
|
// Description:
|
|
//
|
|
//
|
|
// Arguments:
|
|
// HWND hwnd:
|
|
//
|
|
// LPACMDRIVERSETTINGS pads:
|
|
//
|
|
// Return (void):
|
|
//
|
|
// History:
|
|
// 09/08/93 cjp [curtisp]
|
|
//
|
|
//--------------------------------------------------------------------------;
|
|
|
|
void FNLOCAL ControlAboutDriver
|
|
(
|
|
HWND hwnd,
|
|
LPACMDRIVERSETTINGS pads
|
|
)
|
|
{
|
|
PACMDRIVERDETAILS padd;
|
|
MMRESULT mmr;
|
|
|
|
if (NULL == pads)
|
|
return;
|
|
|
|
//
|
|
// if the driver returns MMSYSERR_NOTSUPPORTED, then we need to
|
|
// display the info--otherwise, it supposedly displayed a dialog
|
|
// (or had a critical error?)
|
|
//
|
|
mmr = (MMRESULT)acmDriverMessage((HACMDRIVER)pads->hadid,
|
|
ACMDM_DRIVER_ABOUT,
|
|
(LPARAM)(UINT)hwnd,
|
|
0L);
|
|
|
|
if (MMSYSERR_NOTSUPPORTED != mmr)
|
|
return;
|
|
|
|
|
|
//
|
|
// alloc some zero-init'd memory to hold the about box info
|
|
//
|
|
padd = (PACMDRIVERDETAILS)LocalAlloc(LPTR, sizeof(*padd));
|
|
if (NULL == padd)
|
|
return;
|
|
|
|
//
|
|
// get info and bring up a generic about box...
|
|
//
|
|
padd->cbStruct = sizeof(*padd);
|
|
mmr = acmDriverDetails(pads->hadid, padd, 0L);
|
|
if (MMSYSERR_NOERROR == mmr)
|
|
{
|
|
DialogBoxParam(gpag->hinst,
|
|
DLG_ABOUT_MSACM,
|
|
hwnd,
|
|
DlgProcACMAboutBox,
|
|
(LPARAM)(LPVOID)padd);
|
|
}
|
|
|
|
LocalFree((HLOCAL)padd);
|
|
} // ControlAboutDriver()
|
|
|
|
|
|
//--------------------------------------------------------------------------;
|
|
//
|
|
// BOOL ControlConfigureDriver
|
|
//
|
|
// Description:
|
|
//
|
|
//
|
|
// Arguments:
|
|
// HWND hwnd:
|
|
//
|
|
// LPACMDRIVERSETTINGS pads:
|
|
//
|
|
// Return (BOOL):
|
|
//
|
|
// History:
|
|
// 06/15/93 cjp [curtisp]
|
|
//
|
|
//--------------------------------------------------------------------------;
|
|
|
|
BOOL FNLOCAL ControlConfigureDriver
|
|
(
|
|
HWND hwnd,
|
|
LPACMDRIVERSETTINGS pads
|
|
)
|
|
{
|
|
int n;
|
|
LRESULT lr;
|
|
|
|
if (NULL == pads)
|
|
return (FALSE);
|
|
|
|
//
|
|
//
|
|
//
|
|
lr = acmDriverMessage((HACMDRIVER)pads->hadid,
|
|
DRV_CONFIGURE,
|
|
(UINT)hwnd,
|
|
0L);
|
|
if (DRVCNF_CANCEL == lr)
|
|
return (FALSE);
|
|
|
|
if (DRVCNF_RESTART != lr)
|
|
return (FALSE);
|
|
|
|
//
|
|
//
|
|
//
|
|
n = DialogBox(gpag->hinst, DLG_RESTART_MSACM, hwnd, DlgProcACMRestart);
|
|
if (IDOK == n)
|
|
{
|
|
ControlApplySettings(hwnd);
|
|
ExitWindows(EW_RESTARTWINDOWS, 0);
|
|
}
|
|
|
|
//
|
|
// something apparently changed with config..
|
|
//
|
|
return (TRUE);
|
|
} // ControlConfigureDriver()
|
|
|
|
|
|
//==========================================================================;
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//==========================================================================;
|
|
|
|
//--------------------------------------------------------------------------;
|
|
//
|
|
// BOOL DlgProcPriority
|
|
//
|
|
// Description:
|
|
//
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Return (BOOL):
|
|
//
|
|
//
|
|
// History:
|
|
// 5/31/93 jyg
|
|
//
|
|
//--------------------------------------------------------------------------;
|
|
|
|
typedef struct tPRIORITYDLGPARAM {
|
|
int iPriority; // in/out priority
|
|
int iPriorityMax; // maximum priority value
|
|
BOOL fDisabled; // is disabled
|
|
TCHAR ach[CONTROL_MAX_ITEM_CHARS]; // name of driver
|
|
} PRIORITYDLGPARAM, *PPRIORITYDLGPARAM, FAR *LPPRIORITYDLGPARAM;
|
|
|
|
BOOL FNCALLBACK DlgProcPriority
|
|
(
|
|
HWND hwnd,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
TCHAR achFromTo[80];
|
|
TCHAR ach[80];
|
|
UINT u;
|
|
LPPRIORITYDLGPARAM pdlgparam;
|
|
UINT uCmdId;
|
|
HWND hcb;
|
|
HFONT hfont;
|
|
HWND htxt;
|
|
|
|
//
|
|
//
|
|
//
|
|
switch (uMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
SetWindowLong(hwnd, DWL_USER, lParam);
|
|
|
|
pdlgparam = (LPPRIORITYDLGPARAM)lParam;
|
|
|
|
#ifdef JAPAN
|
|
hfont = GetStockFont(SYSTEM_FIXED_FONT);
|
|
#else
|
|
hfont = GetStockFont(ANSI_VAR_FONT);
|
|
#endif
|
|
|
|
htxt = GetDlgItem(hwnd, IDD_PRIORITY_TXT_DRIVER);
|
|
SetWindowFont(htxt, hfont, FALSE);
|
|
SetWindowText(htxt, pdlgparam->ach);
|
|
|
|
LoadString(gpag->hinst, IDS_PRIORITY_FROMTO, achFromTo, SIZEOF(achFromTo));
|
|
|
|
wsprintf(ach, achFromTo, pdlgparam->iPriority);
|
|
SetDlgItemText(hwnd, IDD_PRIORITY_TXT_FROMTO, ach);
|
|
|
|
//
|
|
// the priority selection is fixed in a dropdownlist box.
|
|
//
|
|
hcb = GetDlgItem(hwnd, IDD_PRIORITY_COMBO_PRIORITY);
|
|
SetWindowFont(hcb, hfont, FALSE);
|
|
|
|
for (u = 1; u <= (UINT)pdlgparam->iPriorityMax; u++)
|
|
{
|
|
wsprintf(ach, gszFormatNumber, (DWORD)u);
|
|
ComboBox_AddString(hcb, ach);
|
|
}
|
|
|
|
ComboBox_SetCurSel(hcb, pdlgparam->iPriority - 1);
|
|
|
|
CheckDlgButton(hwnd, IDD_PRIORITY_CHECK_DISABLE, pdlgparam->fDisabled);
|
|
return (TRUE);
|
|
|
|
case WM_COMMAND:
|
|
uCmdId = GET_WM_COMMAND_ID(wParam,lParam);
|
|
|
|
switch (uCmdId)
|
|
{
|
|
case IDOK:
|
|
pdlgparam = (LPPRIORITYDLGPARAM)GetWindowLong(hwnd, DWL_USER);
|
|
|
|
hcb = GetDlgItem(hwnd, IDD_PRIORITY_COMBO_PRIORITY);
|
|
|
|
pdlgparam->iPriority = ComboBox_GetCurSel(hcb);
|
|
pdlgparam->iPriority++;
|
|
pdlgparam->fDisabled = IsDlgButtonChecked(hwnd, IDD_PRIORITY_CHECK_DISABLE);
|
|
|
|
case IDCANCEL:
|
|
EndDialog(hwnd, (TRUE == uCmdId));
|
|
break;
|
|
|
|
}
|
|
return (TRUE);
|
|
}
|
|
|
|
return (FALSE);
|
|
} // DlgProcPriority()
|
|
|
|
|
|
//==========================================================================;
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//==========================================================================;
|
|
|
|
//--------------------------------------------------------------------------;
|
|
//
|
|
// LPACMDRIVERSETTINGS ControlGetSelectedDriver
|
|
//
|
|
// Description:
|
|
//
|
|
//
|
|
// Arguments:
|
|
// HWND hwnd:
|
|
//
|
|
// Return (LPACMDRIVERSETTINGS):
|
|
//
|
|
// History:
|
|
// 06/15/93 cjp [curtisp]
|
|
//
|
|
//--------------------------------------------------------------------------;
|
|
|
|
LPACMDRIVERSETTINGS FNLOCAL ControlGetSelectedDriver
|
|
(
|
|
HWND hwnd
|
|
)
|
|
{
|
|
HWND hlb;
|
|
UINT u;
|
|
LPACMDRIVERSETTINGS pads;
|
|
|
|
hlb = GetDlgItem(hwnd, IDD_CPL_LIST_DRIVERS);
|
|
|
|
u = (UINT)ListBox_GetCurSel(hlb);
|
|
if (LB_ERR == u)
|
|
{
|
|
DPF(0, "!ControlGetSelectedDriver: apparently there is no selected driver?");
|
|
return (NULL);
|
|
}
|
|
|
|
pads = (LPACMDRIVERSETTINGS)ListBox_GetItemData(hlb, u);
|
|
if (NULL == pads)
|
|
{
|
|
DPF(0, "!ControlGetSelectedDriver: NULL item data for selected driver!!?");
|
|
return (NULL);
|
|
}
|
|
|
|
return (pads);
|
|
} // ControlGetSelectedDriver()
|
|
|
|
|
|
//--------------------------------------------------------------------------;
|
|
//
|
|
// void ControlRefreshList
|
|
//
|
|
// Description:
|
|
//
|
|
//
|
|
// Arguments:
|
|
// HWND hwnd:
|
|
//
|
|
// Return (void):
|
|
//
|
|
// History:
|
|
// 09/08/93 cjp [curtisp]
|
|
//
|
|
//--------------------------------------------------------------------------;
|
|
|
|
void FNLOCAL ControlRefreshList
|
|
(
|
|
HWND hwnd,
|
|
BOOL fNotify
|
|
)
|
|
{
|
|
UINT cItems;
|
|
UINT uSelection;
|
|
ACMDRIVERDETAILS add;
|
|
LPACMDRIVERSETTINGS pads;
|
|
UINT u;
|
|
HWND hlb;
|
|
TCHAR ach[CONTROL_MAX_ITEM_CHARS];
|
|
BOOL f;
|
|
|
|
|
|
//
|
|
//
|
|
//
|
|
hlb = GetDlgItem(hwnd, IDD_CPL_LIST_DRIVERS);
|
|
SetWindowRedraw(hlb, FALSE);
|
|
|
|
//
|
|
//
|
|
//
|
|
cItems = ListBox_GetCount(hlb);
|
|
uSelection = ListBox_GetCurSel(hlb);
|
|
|
|
for (u = 0; u < cItems; u++)
|
|
{
|
|
pads = (LPACMDRIVERSETTINGS)ListBox_GetItemData(hlb, u);
|
|
|
|
ListBox_DeleteString(hlb, u);
|
|
|
|
add.cbStruct = sizeof(add);
|
|
if (MMSYSERR_NOERROR != acmDriverDetails(pads->hadid, &add, 0L))
|
|
{
|
|
add.szLongName[0] = '\0';
|
|
}
|
|
|
|
f = (0 != (pads->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED));
|
|
|
|
wsprintf(ach, gszFormatDriverDesc,
|
|
pads->dwPriority,
|
|
(f ? (LPTSTR)gszDisabled : (LPTSTR)gszNull),
|
|
(LPTSTR)add.szLongName);
|
|
|
|
ListBox_InsertString(hlb, u, ach);
|
|
ListBox_SetItemData(hlb, u, (LPARAM)(LPVOID)pads);
|
|
}
|
|
|
|
ListBox_SetCurSel(hlb, uSelection);
|
|
SetWindowRedraw(hlb, TRUE);
|
|
} // ControlRefreshList()
|
|
|
|
|
|
//--------------------------------------------------------------------------;
|
|
//
|
|
// void ControlChangePriority
|
|
//
|
|
// Description:
|
|
//
|
|
//
|
|
// Arguments:
|
|
// HWND hwnd:
|
|
//
|
|
// Return (void):
|
|
//
|
|
// History:
|
|
// 09/08/93 cjp [curtisp]
|
|
//
|
|
//--------------------------------------------------------------------------;
|
|
|
|
void FNLOCAL ControlChangePriority
|
|
(
|
|
HWND hwnd
|
|
)
|
|
{
|
|
PRIORITYDLGPARAM dlgparam;
|
|
ACMDRIVERDETAILS add;
|
|
LPACMDRIVERSETTINGS pads;
|
|
UINT u;
|
|
int iPrevPriority; // previous priority
|
|
BOOL fPrevDisabled; // previous disabled state
|
|
HWND hlb;
|
|
TCHAR ach[CONTROL_MAX_ITEM_CHARS];
|
|
BOOL f;
|
|
|
|
pads = ControlGetSelectedDriver(hwnd);
|
|
if (NULL == pads)
|
|
return;
|
|
|
|
add.cbStruct = sizeof(add);
|
|
if (MMSYSERR_NOERROR != acmDriverDetails(pads->hadid, &add, 0L))
|
|
return;
|
|
|
|
iPrevPriority = (int)pads->dwPriority;
|
|
fPrevDisabled = (0 != (pads->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED));
|
|
|
|
dlgparam.iPriority = iPrevPriority;
|
|
dlgparam.fDisabled = fPrevDisabled;
|
|
|
|
hlb = GetDlgItem(hwnd, IDD_CPL_LIST_DRIVERS);
|
|
dlgparam.iPriorityMax = ListBox_GetCount(hlb);
|
|
|
|
lstrcpy(dlgparam.ach, add.szLongName);
|
|
|
|
f = (BOOL)DialogBoxParam(gpag->hinst,
|
|
DLG_PRIORITY_SET,
|
|
hwnd,
|
|
DlgProcPriority,
|
|
(LPARAM)(LPVOID)&dlgparam);
|
|
|
|
if (!f)
|
|
return;
|
|
|
|
if ((dlgparam.fDisabled == fPrevDisabled) &&
|
|
(dlgparam.iPriority == iPrevPriority))
|
|
return;
|
|
|
|
|
|
//
|
|
//
|
|
//
|
|
SetWindowRedraw(hlb, FALSE);
|
|
|
|
|
|
//
|
|
// change the disabled state.
|
|
//
|
|
if (dlgparam.fDisabled != fPrevDisabled)
|
|
{
|
|
pads->fdwSupport ^= ACMDRIVERDETAILS_SUPPORTF_DISABLED;
|
|
}
|
|
|
|
|
|
//
|
|
// has there been a priority change?
|
|
//
|
|
if (dlgparam.iPriority != iPrevPriority)
|
|
{
|
|
//
|
|
// remove old entry and add a placeholder
|
|
//
|
|
ListBox_DeleteString(hlb, iPrevPriority - 1);
|
|
|
|
ListBox_InsertString(hlb, dlgparam.iPriority - 1, gszNull);
|
|
ListBox_SetItemData(hlb, dlgparam.iPriority - 1, (LPARAM)(LPVOID)pads);
|
|
}
|
|
|
|
|
|
//
|
|
//
|
|
//
|
|
for (u = 0; u < (UINT)dlgparam.iPriorityMax; u++)
|
|
{
|
|
pads = (LPACMDRIVERSETTINGS)ListBox_GetItemData(hlb, u);
|
|
|
|
ListBox_DeleteString(hlb, u);
|
|
|
|
add.cbStruct = sizeof(add);
|
|
if (MMSYSERR_NOERROR != acmDriverDetails(pads->hadid, &add, 0L))
|
|
continue;
|
|
|
|
f = (0 != (pads->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED));
|
|
|
|
pads->dwPriority = u + 1;
|
|
|
|
wsprintf(ach, gszFormatDriverDesc,
|
|
pads->dwPriority,
|
|
(f ? (LPTSTR)gszDisabled : (LPTSTR)gszNull),
|
|
(LPTSTR)add.szLongName);
|
|
|
|
ListBox_InsertString(hlb, u, ach);
|
|
ListBox_SetItemData(hlb, u, (LPARAM)(LPVOID)pads);
|
|
}
|
|
|
|
ListBox_SetCurSel(hlb, dlgparam.iPriority - 1);
|
|
|
|
SetWindowRedraw(hlb, TRUE);
|
|
} // ControlChangePriority()
|
|
|
|
|
|
//--------------------------------------------------------------------------;
|
|
//
|
|
// void ControlNewDriverSelected
|
|
//
|
|
// Description:
|
|
//
|
|
//
|
|
// Arguments:
|
|
// HWND hwnd:
|
|
//
|
|
// Return (void):
|
|
//
|
|
// History:
|
|
// 09/08/93 cjp [curtisp]
|
|
//
|
|
//--------------------------------------------------------------------------;
|
|
|
|
void FNLOCAL ControlNewDriverSelected
|
|
(
|
|
HWND hwnd
|
|
)
|
|
{
|
|
LRESULT lr;
|
|
LPACMDRIVERSETTINGS pads;
|
|
|
|
pads = ControlGetSelectedDriver(hwnd);
|
|
if (NULL == pads)
|
|
return;
|
|
|
|
lr = acmDriverMessage((HACMDRIVER)pads->hadid,
|
|
DRV_QUERYCONFIGURE,
|
|
0L,
|
|
0L);
|
|
|
|
EnableWindow(GetDlgItem(hwnd, IDD_CPL_BTN_CONFIGURE), (0 != lr));
|
|
} // ControlNewDriverSelected()
|
|
|
|
|
|
//==========================================================================;
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//==========================================================================;
|
|
|
|
//--------------------------------------------------------------------------;
|
|
//
|
|
// UINT ControlWaveDeviceChanged
|
|
//
|
|
// Description:
|
|
//
|
|
//
|
|
// Arguments:
|
|
// HWND hwnd:
|
|
//
|
|
// HWND hcb:
|
|
//
|
|
// UINT uId:
|
|
//
|
|
// Return (UINT):
|
|
//
|
|
// History:
|
|
// 09/08/93 cjp [curtisp]
|
|
//
|
|
//--------------------------------------------------------------------------;
|
|
|
|
UINT FNLOCAL ControlWaveDeviceChanged
|
|
(
|
|
HWND hwnd,
|
|
HWND hcb,
|
|
UINT uId
|
|
)
|
|
{
|
|
UINT uDevId;
|
|
UINT u;
|
|
|
|
uDevId = (UINT)-1;
|
|
|
|
u = (UINT)ComboBox_GetCurSel(hcb);
|
|
if (LB_ERR != u)
|
|
{
|
|
uDevId = (UINT)ComboBox_GetItemData(hcb, u);
|
|
switch (uId)
|
|
{
|
|
case IDD_CPL_COMBO_RECORD:
|
|
CPLSettings.uIdPreferredIn = uDevId;
|
|
break;
|
|
|
|
case IDD_CPL_COMBO_PLAYBACK:
|
|
CPLSettings.uIdPreferredOut = uDevId;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return (uDevId);
|
|
} // ControlWaveDeviceChanged()
|
|
|
|
|
|
//==========================================================================;
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//==========================================================================;
|
|
|
|
//--------------------------------------------------------------------------;
|
|
//
|
|
// void ControlCleanupDialog
|
|
//
|
|
// Description:
|
|
//
|
|
//
|
|
// Arguments:
|
|
// HWND hwnd:
|
|
//
|
|
// Return (void):
|
|
//
|
|
// History:
|
|
// 09/08/93 cjp [curtisp]
|
|
//
|
|
//--------------------------------------------------------------------------;
|
|
|
|
void FNLOCAL ControlCleanupDialog
|
|
(
|
|
HWND hwnd
|
|
)
|
|
{
|
|
//
|
|
//
|
|
//
|
|
if (NULL != ghadidNotify)
|
|
{
|
|
acmDriverRemove(ghadidNotify, 0L);
|
|
ghadidNotify = NULL;
|
|
}
|
|
|
|
|
|
//
|
|
//
|
|
//
|
|
if (NULL != CPLSettings.pads)
|
|
{
|
|
GlobalFreePtr(CPLSettings.pads);
|
|
CPLSettings.pads = NULL;
|
|
}
|
|
} // ControlCleanupDialog()
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------;
|
|
//
|
|
// BOOL ControlDriverEnumCallback
|
|
//
|
|
// Description:
|
|
//
|
|
//
|
|
// Arguments:
|
|
// HACMDRIVERID hadid:
|
|
//
|
|
// DWORD dwInstance:
|
|
//
|
|
// DWORD fdwSupport:
|
|
//
|
|
// Return (BOOL):
|
|
//
|
|
// History:
|
|
// 09/18/93 cjp [curtisp]
|
|
//
|
|
//--------------------------------------------------------------------------;
|
|
|
|
BOOL FNCALLBACK ControlDriverEnumCallback
|
|
(
|
|
HACMDRIVERID hadid,
|
|
DWORD dwInstance,
|
|
DWORD fdwSupport
|
|
)
|
|
{
|
|
MMRESULT mmr;
|
|
HWND hlb;
|
|
ACMDRIVERDETAILS add;
|
|
TCHAR ach[CONTROL_MAX_ITEM_CHARS];
|
|
DWORD dwPriority;
|
|
LPACMDRIVERSETTINGS pads;
|
|
BOOL f;
|
|
UINT u;
|
|
|
|
|
|
add.cbStruct = sizeof(add);
|
|
mmr = acmDriverDetails(hadid, &add, 0L);
|
|
if (MMSYSERR_NOERROR != mmr)
|
|
{
|
|
DPF(0, "!ControlDriverEnumCallback: acmDriverDetails failed! hadid=%.04Xh, mmr=%u", hadid, mmr);
|
|
return (TRUE);
|
|
}
|
|
|
|
mmr = acmMetrics((HACMOBJ)hadid, ACM_METRIC_DRIVER_PRIORITY, &dwPriority);
|
|
if (MMSYSERR_NOERROR != mmr)
|
|
{
|
|
DPF(0, "!ControlDriverEnumCallback: acmMetrics(priority) failed! hadid=%.04Xh, mmr=%u", hadid, mmr);
|
|
return (TRUE);
|
|
}
|
|
|
|
f = (0 != (fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED));
|
|
|
|
wsprintf(ach, gszFormatDriverDesc,
|
|
dwPriority,
|
|
(f ? (LPTSTR)gszDisabled : (LPTSTR)gszNull),
|
|
(LPTSTR)add.szLongName);
|
|
|
|
|
|
hlb = (HWND)(UINT)dwInstance;
|
|
u = ListBox_GetCount(hlb);
|
|
|
|
pads = &CPLSettings.pads[u];
|
|
|
|
pads->hadid = hadid;
|
|
pads->fdwSupport = fdwSupport;
|
|
pads->dwPriority = dwPriority;
|
|
|
|
u = ListBox_AddString(hlb, ach);
|
|
ListBox_SetItemData(hlb, u, (LPARAM)(LPVOID)pads);
|
|
|
|
return (TRUE);
|
|
} // ControlDriverEnumCallback()
|
|
|
|
|
|
//--------------------------------------------------------------------------;
|
|
//
|
|
// BOOL ControlInitDialog
|
|
//
|
|
// Description:
|
|
//
|
|
//
|
|
// Arguments:
|
|
// HWND hwnd:
|
|
//
|
|
// Return (BOOL):
|
|
//
|
|
// History:
|
|
// 09/08/93 cjp [curtisp]
|
|
//
|
|
//--------------------------------------------------------------------------;
|
|
|
|
BOOL FNLOCAL ControlInitDialog
|
|
(
|
|
HWND hwnd
|
|
)
|
|
{
|
|
MMRESULT mmr;
|
|
UINT u;
|
|
UINT cInDevs;
|
|
UINT cOutDevs;
|
|
HWND hlb;
|
|
HWND hcb;
|
|
int aiTabs[2];
|
|
RECT rc;
|
|
RECT rcText;
|
|
POINT ptUpperLeft;
|
|
HDC hdc;
|
|
LPACMDRIVERSETTINGS pads;
|
|
DWORD cb;
|
|
UINT cTotalInstalledDrivers;
|
|
TCHAR ach[10];
|
|
HFONT hfont;
|
|
SIZE sSize;
|
|
|
|
CPLSettings.pads = NULL;
|
|
|
|
//
|
|
// For the tabbed listbox, we are defining 3 columns
|
|
// Priority, State, Name. To be flexible, we need to know
|
|
// the max length of the text for the numeric, and the disabled strings
|
|
//
|
|
// ->| ->|
|
|
// 1 (disabled) Long Name
|
|
//
|
|
// The aiTabs array contains the tabstops where:
|
|
// aiTabs[0]
|
|
//
|
|
mmr = acmMetrics(NULL, ACM_METRIC_COUNT_DRIVERS, &cb);
|
|
if (MMSYSERR_NOERROR != mmr)
|
|
{
|
|
DPF(0, "!ControlInitDialog: acmMetrics(count_drivers) failed! mmr=%u", mmr);
|
|
cb = 0;
|
|
}
|
|
cTotalInstalledDrivers = (UINT)cb;
|
|
|
|
mmr = acmMetrics(NULL, ACM_METRIC_COUNT_DISABLED, &cb);
|
|
if (MMSYSERR_NOERROR != mmr)
|
|
{
|
|
DPF(0, "!ControlInitDialog: acmMetrics(count_disabled) failed! mmr=%u", mmr);
|
|
cb = 0;
|
|
}
|
|
cTotalInstalledDrivers += (UINT)cb;
|
|
|
|
if (0 == cTotalInstalledDrivers)
|
|
{
|
|
// No drivers, MSACM was not initialized correctly.
|
|
EndDialog(hwnd, FALSE);
|
|
return (TRUE);
|
|
}
|
|
|
|
//
|
|
//
|
|
//
|
|
cb = sizeof(*pads) * cTotalInstalledDrivers;
|
|
pads = (LPACMDRIVERSETTINGS)GlobalAllocPtr(GHND, cb);
|
|
if (NULL == pads)
|
|
{
|
|
EndDialog(hwnd, FALSE);
|
|
return (TRUE);
|
|
}
|
|
|
|
CPLSettings.pads = pads;
|
|
|
|
//
|
|
//
|
|
//
|
|
LoadString(gpag->hinst, IDS_TXT_DISABLED, gszDisabled, SIZEOF(gszDisabled));
|
|
|
|
|
|
//
|
|
//
|
|
//
|
|
hlb = GetDlgItem(hwnd, IDD_CPL_LIST_DRIVERS);
|
|
|
|
#ifdef JAPAN
|
|
hfont = GetStockFont(SYSTEM_FIXED_FONT);
|
|
#else
|
|
hfont = GetStockFont(ANSI_VAR_FONT);
|
|
#endif
|
|
|
|
SetWindowFont(hlb, hfont, FALSE);
|
|
|
|
SetWindowRedraw(hlb, FALSE);
|
|
ListBox_ResetContent(hlb);
|
|
|
|
mmr = acmDriverEnum(ControlDriverEnumCallback,
|
|
(DWORD)(UINT)hlb,
|
|
ACM_DRIVERENUMF_NOLOCAL |
|
|
ACM_DRIVERENUMF_DISABLED);
|
|
if (MMSYSERR_NOERROR != mmr)
|
|
{
|
|
DPF(0, "!ControlInitDialog: acmDriverEnum failed! mmr=%u", mmr);
|
|
EndDialog(hwnd, FALSE);
|
|
return (TRUE);
|
|
}
|
|
|
|
|
|
//
|
|
//
|
|
//
|
|
mmr = acmDriverAdd(&ghadidNotify,
|
|
gpag->hinst,
|
|
(LPARAM)(UINT)hwnd,
|
|
WM_ACMMAP_ACM_NOTIFY,
|
|
ACM_DRIVERADDF_NOTIFYHWND);
|
|
if (MMSYSERR_NOERROR != mmr)
|
|
{
|
|
DPF(0, "!ControlInitDialog: acmDriverAdd failed to add notify window! mmr=%u", mmr);
|
|
}
|
|
|
|
|
|
//
|
|
//
|
|
//
|
|
hdc = GetDC(hlb);
|
|
|
|
u = ListBox_GetCount(hlb);
|
|
wsprintf(ach, gszFormatNumber, (DWORD)u);
|
|
|
|
GetTextExtentPoint(hdc, ach, lstrlen(ach), &sSize);
|
|
aiTabs[0] = sSize.cx;
|
|
|
|
#ifdef JAPAN
|
|
//fix kksuzuka: #2206
|
|
//Since the charcter number of Japanese localized Disabled string is less
|
|
// than localized priority string, sSize.cx is not enough to disp Priority
|
|
//string.
|
|
GetTextExtentPoint(hdc, TEXT("xxxxxxxxxx"), 10, &sSize);
|
|
#else
|
|
GetTextExtentPoint(hdc, gszDisabled, lstrlen(gszDisabled), &sSize);
|
|
#endif
|
|
|
|
aiTabs[1] = sSize.cx;
|
|
|
|
ReleaseDC(hlb, hdc);
|
|
|
|
//
|
|
// one dialog base cell
|
|
//
|
|
rc.left = 0;
|
|
rc.right = 4;
|
|
rc.top = 0;
|
|
rc.bottom = 8;
|
|
|
|
MapDialogRect(hwnd,&rc);
|
|
|
|
// rc.right now contains the width of dialog base unit in pixels
|
|
|
|
aiTabs[0] = (aiTabs[0] * 4) / rc.right;
|
|
aiTabs[1] = (aiTabs[1] * 4) / rc.right;
|
|
|
|
// Now add separation between columns.
|
|
|
|
aiTabs[0] += 4;
|
|
aiTabs[1] += aiTabs[0] + 4;
|
|
|
|
ListBox_SetTabStops(hlb, 2, (LPARAM)(LPVOID)aiTabs);
|
|
|
|
|
|
//
|
|
// Note: Translation back to logical units.
|
|
// Tabs[0] = (aiTabs[0] * rc.right) / 4;
|
|
// Tabs[1] = (aiTabs[1] * rc.right) / 4;
|
|
//
|
|
|
|
//
|
|
// Ok, what's going on in the next chunk of code is the column
|
|
// description "Driver" is being moved on top of it's tabbed
|
|
// column. Since we keep the dialog coordinates of the second
|
|
// tab around, we just convert back to logical coordinates and
|
|
// shift the static control over (relative to the origin where
|
|
// the static "Priority" control sits.
|
|
//
|
|
// Move window positions relative to the parent client area, so we
|
|
// need to translate to client coordinates after we've gotten the
|
|
// position of the control in screen coordinates.
|
|
//
|
|
//
|
|
// Use "Priority" as a reference, since it never moves and
|
|
// this function might be called more than once.
|
|
//
|
|
GetWindowRect(GetDlgItem(hwnd,IDD_CPL_STATIC_PRIORITY), &rcText);
|
|
|
|
ptUpperLeft.x = rcText.left;
|
|
ptUpperLeft.y = rcText.top;
|
|
|
|
ScreenToClient(hwnd, &ptUpperLeft);
|
|
|
|
rcText.right -= rcText.left;
|
|
rcText.bottom -= rcText.top;
|
|
|
|
rcText.left = ptUpperLeft.x;
|
|
rcText.top = ptUpperLeft.y;
|
|
|
|
//
|
|
// move relative 2 dialog tabs translated to logical units.
|
|
//
|
|
#if (WINVER < 0x0400)
|
|
rcText.left += (aiTabs[1] * (rc.right - 1)) / 4;
|
|
#else
|
|
rcText.left += (aiTabs[1] * rc.right) / 4;
|
|
#endif
|
|
|
|
MoveWindow(GetDlgItem(hwnd, IDD_CPL_STATIC_DRIVERS),
|
|
rcText.left,
|
|
rcText.top,
|
|
rcText.right,
|
|
rcText.bottom,
|
|
FALSE);
|
|
|
|
//
|
|
// set up the initial selection to be the first driver--i wonder
|
|
// what we should do if NO drivers are installed? but since we
|
|
// will ALWAYS have the PCM converter installed (regardless of whether
|
|
// it is enabled or disabled), i'm not going to worry about it...
|
|
//
|
|
ListBox_SetCurSel(hlb, 0);
|
|
ControlNewDriverSelected(hwnd);
|
|
|
|
SetWindowRedraw(hlb, TRUE);
|
|
InvalidateRect(hlb, NULL, FALSE);
|
|
|
|
|
|
|
|
//
|
|
// !!!
|
|
//
|
|
//
|
|
cInDevs = gpag->cWaveInDevs;
|
|
cOutDevs = gpag->cWaveOutDevs;
|
|
|
|
WAIT_FOR_MUTEX(gpag->hMutexSettings);
|
|
|
|
//
|
|
// fill the output devices combo box
|
|
//
|
|
hcb = GetDlgItem(hwnd, IDD_CPL_COMBO_PLAYBACK);
|
|
SetWindowFont(hcb, hfont, FALSE);
|
|
ComboBox_ResetContent(hcb);
|
|
|
|
if (0 == cOutDevs)
|
|
{
|
|
EnableWindow(hcb, FALSE);
|
|
}
|
|
else
|
|
{
|
|
for (u = 0; u < cOutDevs; u++)
|
|
{
|
|
WAVEOUTCAPS woc;
|
|
|
|
waveOutGetDevCaps(u, &woc, sizeof(woc));
|
|
woc.szPname[SIZEOF(woc.szPname) - 1] = '\0';
|
|
|
|
ComboBox_AddString(hcb, woc.szPname);
|
|
ComboBox_SetItemData(hcb, u + 1, (LPARAM)u);
|
|
}
|
|
|
|
u = (UINT)ComboBox_SelectString(hcb, 0, gpag->pSettings->szPreferredWaveOut);
|
|
if (CB_ERR == u)
|
|
{
|
|
ComboBox_SetCurSel(hcb, 0);
|
|
}
|
|
}
|
|
|
|
//
|
|
// fill the input devices combo box
|
|
//
|
|
hcb = GetDlgItem(hwnd, IDD_CPL_COMBO_RECORD);
|
|
SetWindowFont(hcb, hfont, FALSE);
|
|
ComboBox_ResetContent(hcb);
|
|
|
|
if (0 == cInDevs)
|
|
{
|
|
EnableWindow(hcb, FALSE);
|
|
}
|
|
else
|
|
{
|
|
for (u = 0; u < cInDevs; u++)
|
|
{
|
|
WAVEINCAPS wic;
|
|
|
|
waveInGetDevCaps(u, &wic, sizeof(wic));
|
|
wic.szPname[SIZEOF(wic.szPname) - 1] = '\0';
|
|
|
|
ComboBox_AddString(hcb, wic.szPname);
|
|
ComboBox_SetItemData(hcb, u + 1, (LPARAM)u);
|
|
}
|
|
|
|
u = (UINT)ComboBox_SelectString(hcb, 0, gpag->pSettings->szPreferredWaveIn);
|
|
if (CB_ERR == u)
|
|
{
|
|
ComboBox_SetCurSel(hcb, 0);
|
|
}
|
|
}
|
|
|
|
//
|
|
//
|
|
//
|
|
CPLSettings.fPreferredOnly = gpag->pSettings->fPreferredOnly;
|
|
CheckDlgButton(hwnd, IDD_CPL_CHECK_PREFERRED, gpag->pSettings->fPreferredOnly);
|
|
|
|
RELEASE_MUTEX(gpag->hMutexSettings);
|
|
|
|
#if (WINVER >= 0x0400)
|
|
EnableWindow(GetDlgItem(hwnd, IDD_CPL_BTN_INSTALL), TRUE); //VIJR: disable install
|
|
//CPLSendNotify(hwnd, LOWORD((DWORD)DLG_CPL_MSACM), PSN_CHANGED);
|
|
PropSheet_Changed(GetParent(hwnd),hwnd);
|
|
#endif
|
|
|
|
return (TRUE);
|
|
} // ControlInitDialog()
|
|
|
|
|
|
//==========================================================================;
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//==========================================================================;
|
|
|
|
//--------------------------------------------------------------------------;
|
|
//
|
|
// void ControlCommand
|
|
//
|
|
// Description:
|
|
//
|
|
//
|
|
// Arguments:
|
|
// HWND hwnd:
|
|
//
|
|
// WPARAM wParam:
|
|
//
|
|
// LPARAM lParam:
|
|
//
|
|
// Return (void):
|
|
//
|
|
// History:
|
|
// 09/08/93 cjp [curtisp]
|
|
//
|
|
//--------------------------------------------------------------------------;
|
|
|
|
void FNLOCAL ControlCommand
|
|
(
|
|
HWND hwnd,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
UINT uCmdId;
|
|
UINT uCmd;
|
|
HWND hwndCmd;
|
|
LPACMDRIVERSETTINGS pads;
|
|
|
|
//
|
|
//
|
|
//
|
|
uCmdId = GET_WM_COMMAND_ID(wParam, lParam);
|
|
uCmd = GET_WM_COMMAND_CMD(wParam, lParam);
|
|
hwndCmd = GET_WM_COMMAND_HWND(wParam, lParam);
|
|
|
|
switch (uCmdId)
|
|
{
|
|
case IDD_CPL_BTN_APPLY:
|
|
ControlApplySettings(hwnd);
|
|
break;
|
|
|
|
case IDOK:
|
|
#if (WINVER < 0x0400)
|
|
ControlApplySettings(hwnd);
|
|
if (GetKeyState(VK_CONTROL) < 0)
|
|
break;
|
|
#endif
|
|
|
|
case IDCANCEL:
|
|
WinHelp(hwnd, gszCPLHelp, HELP_QUIT, 0L);
|
|
EndDialog(hwnd, (TRUE == uCmdId));
|
|
break;
|
|
|
|
|
|
case IDD_CPL_BTN_CONFIGURE:
|
|
pads = ControlGetSelectedDriver(hwnd);
|
|
ControlConfigureDriver(hwnd, pads);
|
|
break;
|
|
|
|
case IDD_CPL_BTN_ABOUT:
|
|
pads = ControlGetSelectedDriver(hwnd);
|
|
ControlAboutDriver(hwnd, pads);
|
|
break;
|
|
|
|
case IDD_CPL_BTN_PRIORITY:
|
|
ControlChangePriority(hwnd);
|
|
break;
|
|
|
|
case IDD_CPL_BTN_HELP:
|
|
#ifdef USE_DAYTONA_HELP
|
|
WinHelp(hwnd, gszCPLHelp, HELP_CONTEXT, IDH_CHILD_MSACM );
|
|
#else
|
|
WinHelp(hwnd, gszCPLHelp, HELP_CONTENTS, 0L);
|
|
#endif
|
|
break;
|
|
|
|
case IDD_CPL_BTN_BUMPTOTOP:
|
|
break;
|
|
|
|
case IDD_CPL_BTN_ABLE:
|
|
pads = ControlGetSelectedDriver(hwnd);
|
|
if (NULL != pads)
|
|
{
|
|
pads->fdwSupport ^= ACMDRIVERDETAILS_SUPPORTF_DISABLED;
|
|
ControlRefreshList(hwnd, FALSE);
|
|
}
|
|
break;
|
|
|
|
#if (WINVER >= 0x0400)
|
|
case IDD_CPL_BTN_INSTALL:
|
|
{
|
|
typedef RETERR (WINAPI pfnDICREATEDEVICEINFO)(LPLPDEVICE_INFO lplpdi, LPCSTR lpszDescription, DWORD hDevnode, HKEY hkey, LPCSTR lpszRegsubkey, LPCSTR lpszClassName, HWND hwndParent);
|
|
typedef RETERR (WINAPI pfnDIDESTROYDEVICEINFOLIST)(LPDEVICE_INFO lpdi);
|
|
typedef RETERR (WINAPI pfnDICALLCLASSINSTALLER)(DI_FUNCTION diFctn, LPDEVICE_INFO lpdi);
|
|
|
|
static TCHAR BCODE gszSetupX[] = TEXT("SETUPX.DLL");
|
|
static TCHAR BCODE gszDiCreateDeviceInfo[] = TEXT("DiCreateDeviceInfo");
|
|
static TCHAR BCODE gszDiDestroyDeviceInfoList[] = TEXT("DiDestroyDeviceInfoList");
|
|
static TCHAR BCODE gszDiCallClassInstaller[] = TEXT("DiCallClassInstaller");
|
|
|
|
pfnDICREATEDEVICEINFO FAR* pfnDiCreateDeviceInfo;
|
|
pfnDIDESTROYDEVICEINFOLIST FAR* pfnDiDestroyDeviceInfoList;
|
|
pfnDICALLCLASSINSTALLER FAR* pfnDiCallClassInstaller;
|
|
LPDEVICE_INFO lpdi;
|
|
HINSTANCE hiSetupX;
|
|
|
|
hiSetupX = LoadLibrary(gszSetupX);
|
|
if (hiSetupX <= HINSTANCE_ERROR)
|
|
break;
|
|
pfnDiCreateDeviceInfo = (pfnDICREATEDEVICEINFO FAR*)GetProcAddress(hiSetupX, gszDiCreateDeviceInfo);
|
|
pfnDiDestroyDeviceInfoList = (pfnDIDESTROYDEVICEINFOLIST FAR*)GetProcAddress(hiSetupX, gszDiDestroyDeviceInfoList);
|
|
pfnDiCallClassInstaller = (pfnDICALLCLASSINSTALLER FAR*)GetProcAddress(hiSetupX, gszDiCallClassInstaller);
|
|
|
|
pfnDiCreateDeviceInfo(&lpdi, NULL, NULL, NULL, NULL, "media",
|
|
GetParent(hwnd));
|
|
|
|
lpdi->Flags |= DI_SHOWOEM;
|
|
if (pfnDiCallClassInstaller(DIF_SELECTDEVICE, lpdi) == OK)
|
|
{
|
|
pfnDiCallClassInstaller(DIF_INSTALLDEVICE, lpdi);
|
|
}
|
|
pfnDiDestroyDeviceInfoList(lpdi);
|
|
FreeLibrary(hiSetupX);
|
|
|
|
break;
|
|
}
|
|
#endif
|
|
|
|
case IDD_CPL_CHECK_PREFERRED:
|
|
CPLSettings.fPreferredOnly = IsDlgButtonChecked(hwnd, IDD_CPL_CHECK_PREFERRED);
|
|
break;
|
|
|
|
case IDD_CPL_COMBO_RECORD:
|
|
case IDD_CPL_COMBO_PLAYBACK:
|
|
if (CBN_SELCHANGE == uCmd)
|
|
{
|
|
ControlWaveDeviceChanged(hwnd, hwndCmd, uCmdId);
|
|
}
|
|
break;
|
|
|
|
case IDD_CPL_LIST_DRIVERS:
|
|
switch (uCmd)
|
|
{
|
|
case LBN_SELCHANGE:
|
|
ControlNewDriverSelected(hwnd);
|
|
break;
|
|
|
|
case LBN_DBLCLK:
|
|
if (GetKeyState(VK_CONTROL) < 0)
|
|
{
|
|
uCmd = IDD_CPL_BTN_ABLE;
|
|
}
|
|
else if (GetKeyState(VK_SHIFT) < 0)
|
|
{
|
|
uCmd = IDD_CPL_BTN_BUMPTOTOP;
|
|
}
|
|
else
|
|
{
|
|
uCmd = IDD_CPL_BTN_ABOUT;
|
|
}
|
|
|
|
ControlCommand(hwnd, uCmd, 0L);
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
} // ControlCommand()
|
|
|
|
|
|
//==========================================================================;
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//==========================================================================;
|
|
|
|
//--------------------------------------------------------------------------;
|
|
//
|
|
// BOOL ACMDlg
|
|
//
|
|
// Description:
|
|
//
|
|
//
|
|
// Arguments:
|
|
// HWND hwnd:
|
|
//
|
|
// UINT uMsg:
|
|
//
|
|
// WPARAM wParam:
|
|
//
|
|
// LPARAM lParam:
|
|
//
|
|
// Return (BOOL):
|
|
//
|
|
// History:
|
|
// 09/08/93 cjp [curtisp]
|
|
//
|
|
//--------------------------------------------------------------------------;
|
|
|
|
BOOL FNCALLBACK ACMDlg
|
|
(
|
|
HWND hwnd,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
#if (WINVER >= 0x0400)
|
|
LPNMHDR pnm;
|
|
#endif
|
|
|
|
switch (uMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
ControlInitDialog(hwnd);
|
|
return (TRUE);
|
|
|
|
case WM_COMMAND:
|
|
ControlCommand(hwnd, wParam, lParam);
|
|
return (TRUE);
|
|
|
|
case WM_DESTROY:
|
|
ControlCleanupDialog(hwnd);
|
|
return (TRUE);
|
|
|
|
case WM_ACMMAP_ACM_NOTIFY:
|
|
ControlRefreshList(hwnd, TRUE);
|
|
return (TRUE);
|
|
|
|
|
|
#if (WINVER >= 0x0400)
|
|
//
|
|
// right mouse click (and F1)
|
|
//
|
|
case WM_CONTEXTMENU:
|
|
WinHelp((HWND)wParam, gszCPLHelp, HELP_CONTEXTMENU, (DWORD)(LPSTR)ganKeywordIds);
|
|
break;
|
|
|
|
case WM_HELP:
|
|
WinHelp(((LPHELPINFO)lParam)->hItemHandle, gszCPLHelp, WM_HELP, (DWORD)(LPSTR)ganKeywordIds);
|
|
break;
|
|
|
|
case WM_NOTIFY:
|
|
pnm = (NMHDR FAR *)lParam;
|
|
switch(pnm->code)
|
|
{
|
|
case PSN_KILLACTIVE:
|
|
FORWARD_WM_COMMAND(hwnd, IDOK, 0, 0, SendMessage);
|
|
break;
|
|
|
|
case PSN_APPLY:
|
|
FORWARD_WM_COMMAND(hwnd, IDD_CPL_BTN_APPLY, 0, 0, SendMessage);
|
|
return TRUE;
|
|
|
|
case PSN_SETACTIVE:
|
|
// FORWARD_WM_COMMAND(hwnd, ID_INIT, 0, 0, SendMessage);
|
|
return TRUE;
|
|
|
|
case PSN_RESET:
|
|
FORWARD_WM_COMMAND(hwnd, IDCANCEL, 0, 0, SendMessage);
|
|
return TRUE;
|
|
}
|
|
break;
|
|
#endif
|
|
}
|
|
|
|
return (FALSE);
|
|
} // ACMDlg()
|
|
|
|
|
|
//==========================================================================;
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//==========================================================================;
|
|
|
|
#if (WINVER < 0x0400)
|
|
|
|
//--------------------------------------------------------------------------;
|
|
//
|
|
// LRESULT CPLApplet
|
|
//
|
|
// Description:
|
|
//
|
|
//
|
|
// Arguments:
|
|
// HWND hwnd:
|
|
//
|
|
// UINT uMsg:
|
|
//
|
|
// LPARAM lParam1:
|
|
//
|
|
// LPARAM lParam2:
|
|
//
|
|
// Return (LRESULT):
|
|
//
|
|
// History:
|
|
// 09/08/93 cjp [curtisp]
|
|
//
|
|
//--------------------------------------------------------------------------;
|
|
|
|
EXTERN_C LRESULT FNEXPORT CPlApplet
|
|
(
|
|
HWND hwnd,
|
|
UINT uMsg,
|
|
LPARAM lParam1,
|
|
LPARAM lParam2
|
|
)
|
|
{
|
|
static BOOL fAppletEntered = FALSE;
|
|
LPNEWCPLINFO pcpli;
|
|
|
|
switch (uMsg)
|
|
{
|
|
case CPL_INIT:
|
|
#ifdef WIN32
|
|
//
|
|
// Is it a bug that we rely on ENABLE being called?
|
|
//
|
|
|
|
mapSettingsRestore();
|
|
#endif
|
|
//
|
|
// For snowball program managment. They don't want to document
|
|
// the CPL.
|
|
//
|
|
if (!gpag->fEnableControl)
|
|
return (FALSE);
|
|
|
|
return (TRUE);
|
|
|
|
case CPL_GETCOUNT:
|
|
return (1L);
|
|
|
|
case CPL_NEWINQUIRE:
|
|
pcpli = (LPNEWCPLINFO)lParam2;
|
|
|
|
pcpli->dwSize = sizeof(*pcpli);
|
|
pcpli->hIcon = LoadIcon(gpag->hinst, ICON_MSACM);
|
|
|
|
LoadString(gpag->hinst, IDS_CPL_NAME, pcpli->szName, SIZEOF(pcpli->szName));
|
|
LoadString(gpag->hinst, IDS_CPL_INFO, pcpli->szInfo, SIZEOF(pcpli->szInfo));
|
|
lstrcpy(pcpli->szHelpFile, gszCPLHelp);
|
|
|
|
pcpli->lData = 0;
|
|
pcpli->dwHelpContext = 0;
|
|
|
|
return (TRUE);
|
|
|
|
|
|
case CPL_DBLCLK:
|
|
if (!fAppletEntered)
|
|
{
|
|
fAppletEntered = TRUE;
|
|
DialogBox(gpag->hinst, DLG_CPL_MSACM, hwnd, ACMDlg);
|
|
fAppletEntered = FALSE;
|
|
}
|
|
break;
|
|
|
|
case CPL_SELECT:
|
|
case CPL_STOP:
|
|
case CPL_EXIT:
|
|
break;
|
|
}
|
|
|
|
return (0L);
|
|
} // CPLApplet()
|
|
|
|
#else // WINVER
|
|
|
|
|
|
//
|
|
// Function: ReleasePage, private
|
|
//
|
|
// Descriptions:
|
|
// This function performs any needed cleanup on the property sheet which
|
|
// was previously created.
|
|
//
|
|
// Arguments:
|
|
// ppsp -- the page which is being deleted.
|
|
//
|
|
// Returns:
|
|
// void
|
|
//
|
|
|
|
EXTERN_C void FNEXPORT ReleasePage
|
|
(
|
|
LPPROPSHEETPAGE ppsp
|
|
)
|
|
{
|
|
LocalFree((HLOCAL)ppsp->lParam);
|
|
}
|
|
|
|
//
|
|
// Function: AddAcmPages, private
|
|
//
|
|
// Descriptions:
|
|
// This function creates a property sheet object for the resource page
|
|
// which shows resource information.
|
|
//
|
|
// Arguments:
|
|
// lpszResource -- the class for which the page is to be added
|
|
// lpfnAddPage -- the callback function.
|
|
// lParam -- the lParam to be passed to the callback.
|
|
//
|
|
// Returns:
|
|
// TRUE, if no error FALSE, otherwise.
|
|
//
|
|
|
|
EXTERN_C BOOL FNEXPORT AddAcmPages
|
|
(
|
|
LPVOID pszTitle,
|
|
LPFNADDPROPSHEETPAGE lpfnAddPropSheetPage,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
PROPSHEETPAGE psp;
|
|
PSTR szTitle;
|
|
|
|
if (szTitle = (PSTR)LocalAlloc(LPTR, lstrlen(pszTitle) + 1)) {
|
|
HPROPSHEETPAGE hpsp;
|
|
|
|
lstrcpy(szTitle, pszTitle);
|
|
psp.dwSize = sizeof(PROPSHEETPAGE);
|
|
psp.dwFlags = PSP_USETITLE | PSP_USERELEASEFUNC;
|
|
psp.hInstance = gpag->hinst;
|
|
psp.pszTemplate = DLG_CPL_MSACM;
|
|
psp.pszIcon = NULL;
|
|
psp.pszTitle = szTitle;
|
|
psp.pfnDlgProc = ACMDlg;
|
|
psp.lParam = (LPARAM)(LPSTR)szTitle;
|
|
psp.pfnRelease = ReleasePage;
|
|
psp.pcRefParent = NULL;
|
|
if (hpsp = CreatePropertySheetPage(&psp)) {
|
|
if (lpfnAddPropSheetPage(hpsp, lParam))
|
|
return TRUE;
|
|
DestroyPropertySheetPage(hpsp);
|
|
} else
|
|
LocalFree((HLOCAL)szTitle);
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
LRESULT PASCAL CPLSendNotify(HWND hwnd, int idFrom, int code)
|
|
{
|
|
LRESULT lr;
|
|
NMHDR nm;
|
|
|
|
nm.hwndFrom = hwnd;
|
|
nm.idFrom = idFrom;
|
|
nm.code = code;
|
|
|
|
lr = SendMessage(GetParent(hwnd), WM_NOTIFY, 0, (LPARAM)(LPVOID)&nm);
|
|
return (lr);
|
|
}
|
|
|
|
#endif
|