403 lines
11 KiB
C
403 lines
11 KiB
C
|
|
|||
|
/************************************************************************/
|
|||
|
|
|||
|
/*
|
|||
|
** Copyright (c) 1985-1998 Microsoft Corporation
|
|||
|
**
|
|||
|
** Title: config.c - Multimedia Systems Media Control Interface
|
|||
|
** waveform audio driver for RIFF wave files.
|
|||
|
**
|
|||
|
** Version: 1.00
|
|||
|
**
|
|||
|
** Date: 18-Apr-1990
|
|||
|
**
|
|||
|
** Author: ROBWI
|
|||
|
*/
|
|||
|
|
|||
|
/************************************************************************/
|
|||
|
|
|||
|
/*
|
|||
|
** Change log:
|
|||
|
**
|
|||
|
** DATE REV DESCRIPTION
|
|||
|
** ----------- ----- ------------------------------------------
|
|||
|
** 10-Jan-1992 MikeTri Ported to NT
|
|||
|
** @@@ need to change slash slash comments to slash star
|
|||
|
*/
|
|||
|
|
|||
|
/************************************************************************/
|
|||
|
#define UNICODE
|
|||
|
|
|||
|
#define NOGDICAPMASKS
|
|||
|
#define NOVIRTUALKEYCODES
|
|||
|
#define NOWINSTYLES
|
|||
|
#define NOSYSMETRICS
|
|||
|
#define NOMENUS
|
|||
|
#define NOICONS
|
|||
|
#define NOKEYSTATES
|
|||
|
#define NOSYSCOMMANDS
|
|||
|
#define NORASTEROPS
|
|||
|
#define NOSHOWWINDOW
|
|||
|
#define OEMRESOURCE
|
|||
|
#define NOATOM
|
|||
|
#define NOCLIPBOARD
|
|||
|
#define NOCOLOR
|
|||
|
#define NODRAWTEXT
|
|||
|
#define NOGDI
|
|||
|
#define NOKERNEL
|
|||
|
#define NONLS
|
|||
|
#define NOMB
|
|||
|
#define NOMEMMGR
|
|||
|
#define NOMETAFILE
|
|||
|
#define NOOPENFILE
|
|||
|
#define NOTEXTMETRIC
|
|||
|
#define NOWH
|
|||
|
#define NOWINOFFSETS
|
|||
|
#define NOCOMM
|
|||
|
#define NOKANJI
|
|||
|
#define NOPROFILER
|
|||
|
#define NODEFERWINDOWPOS
|
|||
|
|
|||
|
#define NOMMDRV
|
|||
|
#define MMNOMMIO
|
|||
|
#define MMNOJOY
|
|||
|
#define MMNOTIMER
|
|||
|
#define MMNOAUX
|
|||
|
#define MMNOMIDI
|
|||
|
#define MMNOWAVE
|
|||
|
|
|||
|
#include <windows.h>
|
|||
|
#include "mciwave.h"
|
|||
|
#include <mmddk.h>
|
|||
|
#include "config.h"
|
|||
|
#include <mcihlpid.h>
|
|||
|
|
|||
|
/************************************************************************/
|
|||
|
|
|||
|
#define MAXINIDRIVER 132
|
|||
|
|
|||
|
PRIVATE SZCODE aszNULL[] = L"";
|
|||
|
PRIVATE SZCODE aszSystemIni[] = L"system.ini";
|
|||
|
PRIVATE WCHAR aszWordFormat[] = L"%u";
|
|||
|
PRIVATE WCHAR aszTailWordFormat[] = L" %u";
|
|||
|
|
|||
|
const static DWORD aHelpIds[] = { // Context Help IDs
|
|||
|
IDSCROLL, IDH_MCI_WAVEFORM_DRIVER,
|
|||
|
(DWORD)-1, IDH_MCI_WAVEFORM_DRIVER,
|
|||
|
IDCOUNT, IDH_MCI_WAVEFORM_DRIVER,
|
|||
|
0, 0
|
|||
|
};
|
|||
|
|
|||
|
const static TCHAR cszHelpFile[] = TEXT("MMDRV.HLP");
|
|||
|
|
|||
|
/************************************************************************/
|
|||
|
/*
|
|||
|
@doc INTERNAL MCIWAVE
|
|||
|
|
|||
|
@func SSZ | GetTail |
|
|||
|
This function returns a pointer into the given string at the
|
|||
|
first non-blank character after the current word. If it fails to find
|
|||
|
a second word, a pointer to the terminating NULL character is returned.
|
|||
|
|
|||
|
@parm SSZ | ssz |
|
|||
|
Points to the string whose tail is to be returned.
|
|||
|
|
|||
|
@rdesc Returns a pointer into the string passed.
|
|||
|
*/
|
|||
|
|
|||
|
PRIVATE SSZ PASCAL NEAR GetTail(
|
|||
|
SSZ ssz)
|
|||
|
{
|
|||
|
while (*ssz && *ssz != ' ')
|
|||
|
ssz++;
|
|||
|
while (*ssz == ' ')
|
|||
|
ssz++ ;
|
|||
|
return ssz;
|
|||
|
}
|
|||
|
|
|||
|
/************************************************************************/
|
|||
|
/*
|
|||
|
@doc INTERNAL MCIWAVE
|
|||
|
|
|||
|
@func UINT | GetCmdParm |
|
|||
|
This function retrieves the current audio buffers parameter using
|
|||
|
the INI strings contained in the configuration block. The audio
|
|||
|
buffers parameter is a number included in the INI entry for this
|
|||
|
driver as a parameter.
|
|||
|
|
|||
|
@parm <t>LPDRVCONFIGINFO<d> | lpdci |
|
|||
|
Points to the driver configuration information passed to the
|
|||
|
dialog creation function.
|
|||
|
|
|||
|
@rdesc Returns the current audio buffers.
|
|||
|
*/
|
|||
|
|
|||
|
STATICFN UINT PASCAL NEAR GetCmdParm(
|
|||
|
LPDRVCONFIGINFO lpdci)
|
|||
|
{
|
|||
|
WCHAR aszDriver[MAXINIDRIVER];
|
|||
|
SSZ pszTail;
|
|||
|
|
|||
|
|
|||
|
// Assume things will go wrong... initialise variables
|
|||
|
pszTail = aszDriver;
|
|||
|
|
|||
|
if (GetPrivateProfileString( lpdci->lpszDCISectionName,
|
|||
|
lpdci->lpszDCIAliasName,
|
|||
|
aszNULL,
|
|||
|
aszDriver,
|
|||
|
sizeof(aszDriver) / sizeof(WCHAR),
|
|||
|
aszSystemIni))
|
|||
|
{
|
|||
|
// We have got the name of the driver
|
|||
|
// Just in case the user has added the command parameter to the
|
|||
|
// end of the name we had better make sure there is only one token
|
|||
|
// on the line.
|
|||
|
WCHAR parameters[6];
|
|||
|
LPWSTR pszDefault;
|
|||
|
|
|||
|
pszTail = GetTail((SSZ)aszDriver);
|
|||
|
pszDefault = pszTail; // Either the number on the end, or NULL
|
|||
|
|
|||
|
if (*pszTail) {
|
|||
|
// RATS!! Not a simple name
|
|||
|
while (*--pszTail == L' ') {
|
|||
|
}
|
|||
|
*++pszTail = L'\0'; // Terminate the string after the DLL name
|
|||
|
}
|
|||
|
|
|||
|
if (GetProfileString(aszDriver, lpdci->lpszDCIAliasName, pszDefault, parameters, sizeof(parameters)/sizeof(WCHAR))) {
|
|||
|
pszTail = parameters;
|
|||
|
}
|
|||
|
|
|||
|
} else {
|
|||
|
aszDriver[0] = L'\0';
|
|||
|
}
|
|||
|
return(GetAudioSeconds(pszTail));
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/************************************************************************/
|
|||
|
/*
|
|||
|
@doc INTERNAL MCIWAVE
|
|||
|
|
|||
|
@func UINT | PutCmdParm |
|
|||
|
This function saves the current audio buffers parameter using
|
|||
|
the INI strings contained in the configuration block.
|
|||
|
|
|||
|
@parm <t>LPDRVCONFIGINFO<d> | lpdci |
|
|||
|
Points to the driver configuration information passed to the
|
|||
|
dialog creation function.
|
|||
|
|
|||
|
@parm UINT | wSeconds |
|
|||
|
Contains the audio buffer seconds parameter to save.
|
|||
|
|
|||
|
@rdesc Nothing.
|
|||
|
*/
|
|||
|
|
|||
|
PRIVATE VOID PASCAL NEAR PutCmdParm(
|
|||
|
LPDRVCONFIGINFO lpdci,
|
|||
|
UINT wSeconds)
|
|||
|
{
|
|||
|
WCHAR aszDriver[MAXINIDRIVER];
|
|||
|
SSZ sszDriverTail;
|
|||
|
|
|||
|
if (GetPrivateProfileString( lpdci->lpszDCISectionName,
|
|||
|
lpdci->lpszDCIAliasName,
|
|||
|
aszNULL,
|
|||
|
aszDriver,
|
|||
|
(sizeof(aszDriver) / sizeof(WCHAR)) - 6,
|
|||
|
aszSystemIni)) {
|
|||
|
WCHAR parameters[10];
|
|||
|
|
|||
|
// There might be a command parameter on the end of the DLL name.
|
|||
|
// Ensure we only have the first token
|
|||
|
|
|||
|
sszDriverTail = GetTail((SSZ)aszDriver);
|
|||
|
if (*sszDriverTail) {
|
|||
|
// RATS!! Not a simple name
|
|||
|
while (*--sszDriverTail == L' ') {
|
|||
|
}
|
|||
|
*++sszDriverTail = L'\0'; // Terminate the string after the DLL name
|
|||
|
}
|
|||
|
|
|||
|
wsprintfW(parameters, aszWordFormat, wSeconds);
|
|||
|
WriteProfileString(aszDriver, lpdci->lpszDCIAliasName, parameters);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/************************************************************************/
|
|||
|
/*
|
|||
|
@doc INTERNAL MCIWAVE
|
|||
|
|
|||
|
@func BOOL | ConfigDlgProc |
|
|||
|
This function is the message handle for the driver configuration
|
|||
|
window.
|
|||
|
|
|||
|
@parm HWND | hwndDlg |
|
|||
|
Window handle to the dialog.
|
|||
|
|
|||
|
@parm UINT | wMsg |
|
|||
|
Current message being sent.
|
|||
|
|
|||
|
@flag WM_INITDIALOG |
|
|||
|
During dialog initialization, the pointer to the configuration
|
|||
|
parameter block is saved to a static pointer. Note that there should
|
|||
|
only be a single instance of this dialog box at any one time. The
|
|||
|
current audio dialog buffer seconds is set from the INI file entry.
|
|||
|
|
|||
|
@flag WM_HSCROLL |
|
|||
|
This responds to the scroll bar by changing the currently displayed
|
|||
|
value of audio seconds and updating the scroll bar thumb. To look
|
|||
|
nice, the count and scroll bar are only updated if the value actually
|
|||
|
changes. Note that the error return for GetDlgItemInt is not checked
|
|||
|
because it is initially set to an integer value, so it is always
|
|||
|
valid.
|
|||
|
|
|||
|
@flag WM_CLOSE |
|
|||
|
If the close box is used, cancel the dialog, returning DRVCNF_CANCEL.
|
|||
|
|
|||
|
@flag WM_COMMAND |
|
|||
|
If the message is being sent on behalf of the OK button, the current
|
|||
|
audio seconds value is saved, and the dialog is terminated, returning
|
|||
|
the DRVCNF_OK value to the driver entry. Note that the error return for
|
|||
|
GetDlgItemInt is not checked because it is initially set to an integer
|
|||
|
value, so it is always valid. If the message is being sent on behalf
|
|||
|
of the Cancel button, the dialog is terminated returning the
|
|||
|
DRVCNF_CANCEL value.
|
|||
|
|
|||
|
@parm WPARAM | wParam |
|
|||
|
Message parameter.
|
|||
|
|
|||
|
@parm LPARAM | lParam |
|
|||
|
Message parameter.
|
|||
|
|
|||
|
@rdesc Depends on the message sent.
|
|||
|
*/
|
|||
|
|
|||
|
PUBLIC INT_PTR PASCAL ConfigDlgProc(
|
|||
|
HWND hwndDlg,
|
|||
|
UINT wMsg,
|
|||
|
WPARAM wParam,
|
|||
|
LPARAM lParam)
|
|||
|
{
|
|||
|
UINT wSeconds;
|
|||
|
UINT wNewSeconds;
|
|||
|
BOOL fTranslated;
|
|||
|
HWND hwndItem;
|
|||
|
static LPDRVCONFIGINFO lpdci;
|
|||
|
|
|||
|
switch (wMsg) {
|
|||
|
case WM_INITDIALOG:
|
|||
|
lpdci = (LPDRVCONFIGINFO)lParam;
|
|||
|
wSeconds = GetCmdParm(lpdci);
|
|||
|
hwndItem = GetDlgItem(hwndDlg, IDSCROLL);
|
|||
|
SetScrollRange(hwndItem, SB_CTL, MinAudioSeconds, MaxAudioSeconds, FALSE);
|
|||
|
SetScrollPos(hwndItem, SB_CTL, wSeconds, FALSE);
|
|||
|
SetDlgItemInt(hwndDlg, IDCOUNT, wSeconds, FALSE);
|
|||
|
break;
|
|||
|
|
|||
|
case WM_HSCROLL:
|
|||
|
wSeconds = GetDlgItemInt(hwndDlg, IDCOUNT, &fTranslated, FALSE);
|
|||
|
hwndItem = (HWND)lParam;
|
|||
|
|
|||
|
switch (LOWORD(wParam)) {
|
|||
|
case SB_PAGEDOWN:
|
|||
|
case SB_LINEDOWN:
|
|||
|
wNewSeconds = min(MaxAudioSeconds, wSeconds + 1);
|
|||
|
break;
|
|||
|
|
|||
|
case SB_PAGEUP:
|
|||
|
case SB_LINEUP:
|
|||
|
wNewSeconds = max(MinAudioSeconds, wSeconds - 1);
|
|||
|
break;
|
|||
|
|
|||
|
case SB_TOP:
|
|||
|
wNewSeconds = MinAudioSeconds;
|
|||
|
break;
|
|||
|
|
|||
|
case SB_BOTTOM:
|
|||
|
wNewSeconds = MaxAudioSeconds;
|
|||
|
break;
|
|||
|
|
|||
|
case SB_THUMBPOSITION:
|
|||
|
case SB_THUMBTRACK:
|
|||
|
wNewSeconds = HIWORD(wParam);
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
if (wNewSeconds != wSeconds) {
|
|||
|
SetScrollPos(hwndItem, SB_CTL, wNewSeconds, TRUE);
|
|||
|
SetDlgItemInt(hwndDlg, IDCOUNT, wNewSeconds, FALSE);
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case WM_CLOSE:
|
|||
|
EndDialog(hwndDlg, DRVCNF_CANCEL);
|
|||
|
break;
|
|||
|
|
|||
|
case WM_CONTEXTMENU:
|
|||
|
WinHelp ((HWND)wParam, cszHelpFile, HELP_CONTEXTMENU, (ULONG_PTR)aHelpIds);
|
|||
|
return TRUE;
|
|||
|
|
|||
|
case WM_HELP:
|
|||
|
{
|
|||
|
LPHELPINFO lphi = (LPVOID) lParam;
|
|||
|
WinHelp (lphi->hItemHandle, cszHelpFile, HELP_WM_HELP, (ULONG_PTR)aHelpIds);
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
case WM_COMMAND:
|
|||
|
switch (LOWORD(wParam)) {
|
|||
|
case IDOK:
|
|||
|
PutCmdParm(lpdci, GetDlgItemInt(hwndDlg, IDCOUNT, &fTranslated, FALSE));
|
|||
|
EndDialog(hwndDlg, DRVCNF_OK);
|
|||
|
break;
|
|||
|
|
|||
|
case IDCANCEL:
|
|||
|
EndDialog(hwndDlg, DRVCNF_CANCEL);
|
|||
|
break;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
/************************************************************************/
|
|||
|
/*
|
|||
|
@doc INTERNAL MCIWAVE
|
|||
|
|
|||
|
@func int | Config |
|
|||
|
This function creates the configuration dialog, and returns the
|
|||
|
value from dialog box call.
|
|||
|
|
|||
|
@parm HWND | hwnd |
|
|||
|
Contains the handle of what is to be the parent of the dialog.
|
|||
|
|
|||
|
@parm <t>LPDRVCONFIGINFO<d> | lpdci |
|
|||
|
Points to the driver configuration information passed to the
|
|||
|
configuration message.
|
|||
|
|
|||
|
@parm HINSTANCE | hInstance |
|
|||
|
Contains a handle to the module in which the dialog is stored.
|
|||
|
|
|||
|
@rdesc Returns the dialog box call function return.
|
|||
|
*/
|
|||
|
|
|||
|
PUBLIC INT_PTR PASCAL FAR Config(
|
|||
|
HWND hwnd,
|
|||
|
LPDRVCONFIGINFO lpdci,
|
|||
|
HINSTANCE hInstance)
|
|||
|
{
|
|||
|
return DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_CONFIG), hwnd, ConfigDlgProc, (LPARAM)lpdci);
|
|||
|
}
|
|||
|
|
|||
|
/************************************************************************/
|
|||
|
|