333 lines
9.8 KiB
C
333 lines
9.8 KiB
C
|
/******************************************************************************
|
|||
|
|
|||
|
Copyright (C) Microsoft Corporation 1985-1995. All rights reserved.
|
|||
|
|
|||
|
Title: config.c - Multimedia Systems Media Control Interface
|
|||
|
driver for AVI - configuration dialog.
|
|||
|
|
|||
|
*****************************************************************************/
|
|||
|
#include "graphic.h"
|
|||
|
|
|||
|
#ifndef ARRAYSIZE
|
|||
|
#define ARRAYSIZE(x) (sizeof((x))/sizeof((x)[0]))
|
|||
|
#endif
|
|||
|
|
|||
|
/*
|
|||
|
#ifndef _WIN32
|
|||
|
#define SZCODE char _based(_segname("_CODE"))
|
|||
|
#else
|
|||
|
#define SZCODE const TCHAR
|
|||
|
#endif
|
|||
|
*/
|
|||
|
|
|||
|
SZCODE szDEFAULTVIDEO[] = TEXT ("DefaultVideo");
|
|||
|
SZCODE szSEEKEXACT[] = TEXT ("AccurateSeek");
|
|||
|
SZCODE szZOOMBY2[] = TEXT ("ZoomBy2");
|
|||
|
//SZCODE szSTUPIDMODE[] = TEXT ("DontBufferOffscreen");
|
|||
|
SZCODE szSKIPFRAMES[] = TEXT ("SkipFrames");
|
|||
|
SZCODE szUSEAVIFILE[] = TEXT ("UseAVIFile");
|
|||
|
SZCODE szNOSOUND[] = TEXT("NoSound");
|
|||
|
|
|||
|
const TCHAR szIni[] = TEXT ("MCIAVI");
|
|||
|
|
|||
|
SZCODE gszMCIAVIOpt[] = TEXT ("Software\\Microsoft\\Multimedia\\Video For Windows\\MCIAVI");
|
|||
|
SZCODE gszDefVideoOpt[] = TEXT ("DefaultOptions");
|
|||
|
|
|||
|
#ifdef _WIN32
|
|||
|
/* Registry values are stored as REG_DWORD */
|
|||
|
int sz1 = 1;
|
|||
|
int sz0 = 0;
|
|||
|
#else
|
|||
|
SZCODE sz1[] = TEXT("1");
|
|||
|
SZCODE sz0[] = TEXT("0");
|
|||
|
#endif
|
|||
|
|
|||
|
SZCODE szIntl[] = TEXT ("Intl");
|
|||
|
SZCODE szDecimal[] = TEXT ("sDecimal");
|
|||
|
SZCODE szThousand[] = TEXT ("sThousand");
|
|||
|
|
|||
|
SZCODE szDrawDib[] = TEXT("DrawDib");
|
|||
|
SZCODE szDVA[] = TEXT("DVA");
|
|||
|
|
|||
|
|
|||
|
typedef BOOL (WINAPI *SHOWMMCPLPROPSHEETW)(
|
|||
|
HWND hwndParent,
|
|||
|
LPCWSTR szPropSheetID,
|
|||
|
LPWSTR szTabName,
|
|||
|
LPWSTR szCaption);
|
|||
|
|
|||
|
/* Make sure we only have one configure box up at a time.... */
|
|||
|
HWND ghwndConfig = NULL;
|
|||
|
|
|||
|
// Converts a Wide byte character string to a single byte character string
|
|||
|
BOOL FAR PASCAL UnicodeToAnsi (
|
|||
|
char * pszDest,
|
|||
|
TCHAR * pszSrc,
|
|||
|
UINT cchMaxLen)
|
|||
|
{
|
|||
|
|
|||
|
if ((pszDest == NULL) ||
|
|||
|
(pszSrc == NULL) ||
|
|||
|
(cchMaxLen == 0))
|
|||
|
return FALSE;
|
|||
|
|
|||
|
WideCharToMultiByte (CP_ACP, 0, pszSrc, -1,
|
|||
|
pszDest, cchMaxLen,
|
|||
|
NULL, NULL);
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
DWORD ReadOptionsFromReg(void)
|
|||
|
{
|
|||
|
HKEY hkVideoOpt;
|
|||
|
DWORD dwType;
|
|||
|
DWORD dwOpt;
|
|||
|
DWORD cbSize;
|
|||
|
|
|||
|
if (RegCreateKey(HKEY_CURRENT_USER, (LPTSTR)gszMCIAVIOpt, &hkVideoOpt))
|
|||
|
return 0;
|
|||
|
|
|||
|
cbSize = sizeof(DWORD);
|
|||
|
if (RegQueryValueEx(hkVideoOpt,(LPTSTR)gszDefVideoOpt,
|
|||
|
NULL, &dwType, (LPBYTE)&dwOpt, &cbSize))
|
|||
|
{
|
|||
|
dwOpt = 0;
|
|||
|
RegSetValueEx(hkVideoOpt, (LPTSTR)gszDefVideoOpt, 0, REG_DWORD,(LPBYTE)&dwOpt, sizeof(DWORD));
|
|||
|
}
|
|||
|
|
|||
|
RegCloseKey(hkVideoOpt);
|
|||
|
|
|||
|
return dwOpt;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
DWORD FAR PASCAL ReadConfigInfo(void)
|
|||
|
{
|
|||
|
DWORD dwOptions = 0L;
|
|||
|
|
|||
|
dwOptions = ReadOptionsFromReg();
|
|||
|
|
|||
|
//
|
|||
|
// ask the display device if it can do 256 color.
|
|||
|
//
|
|||
|
#ifndef _WIN32
|
|||
|
int i;
|
|||
|
|
|||
|
/*
|
|||
|
** Bugbug - not apparently used, so why do it ?!?
|
|||
|
**
|
|||
|
HDC hdc;
|
|||
|
hdc = GetDC(NULL);
|
|||
|
i = GetDeviceCaps(hdc, BITSPIXEL) * GetDeviceCaps(hdc, PLANES);
|
|||
|
ReleaseDC(NULL, hdc);
|
|||
|
**
|
|||
|
**
|
|||
|
*/
|
|||
|
|
|||
|
i = mmGetProfileInt(szIni, szDEFAULTVIDEO,
|
|||
|
(i < 8 && (GetWinFlags() & WF_CPU286)) ? 240 : 0);
|
|||
|
|
|||
|
if (i >= 200)
|
|||
|
dwOptions |= MCIAVIO_USEVGABYDEFAULT;
|
|||
|
#endif
|
|||
|
|
|||
|
////if (mmGetProfileInt(szIni, szSEEKEXACT, 1))
|
|||
|
// Note: We always want this option.
|
|||
|
dwOptions |= MCIAVIO_SEEKEXACT;
|
|||
|
|
|||
|
// if (mmGetProfileInt(szIni, szZOOMBY2, 0))
|
|||
|
// dwOptions |= MCIAVIO_ZOOMBY2;
|
|||
|
|
|||
|
////if (mmGetProfileInt(szIni, szFAILIFNOWAVE, 0))
|
|||
|
//// dwOptions |= MCIAVIO_FAILIFNOWAVE;
|
|||
|
|
|||
|
// if (mmGetProfileInt(szIni, szSTUPIDMODE, 0))
|
|||
|
// dwOptions |= MCIAVIO_STUPIDMODE;
|
|||
|
|
|||
|
// Note: These settings are still in WIN.INI, not the registry
|
|||
|
// I know.
|
|||
|
if (mmGetProfileInt(szIni, szSKIPFRAMES, 1))
|
|||
|
dwOptions |= MCIAVIO_SKIPFRAMES;
|
|||
|
|
|||
|
if (mmGetProfileInt(szIni, szUSEAVIFILE, 0))
|
|||
|
dwOptions |= MCIAVIO_USEAVIFILE;
|
|||
|
|
|||
|
if (mmGetProfileInt(szIni, szNOSOUND, 0))
|
|||
|
dwOptions |= MCIAVIO_NOSOUND;
|
|||
|
|
|||
|
if (mmGetProfileInt(szDrawDib, szDVA, TRUE))
|
|||
|
dwOptions |= MCIAVIO_USEDCI;
|
|||
|
|
|||
|
return dwOptions;
|
|||
|
}
|
|||
|
|
|||
|
void FAR PASCAL WriteConfigInfo(DWORD dwOptions)
|
|||
|
{
|
|||
|
#ifndef _WIN32
|
|||
|
// !!! This shouldn't get written out if it is the default!
|
|||
|
mmWriteProfileString(szIni, szDEFAULTVIDEO,
|
|||
|
(dwOptions & MCIAVIO_USEVGABYDEFAULT) ? szVIDEO240 : szVIDEOWINDOW);
|
|||
|
#endif
|
|||
|
|
|||
|
////mmWriteProfileInt(szIni, szSEEKEXACT,
|
|||
|
//// (dwOptions & MCIAVIO_SEEKEXACT) ? sz1 : sz0);
|
|||
|
|
|||
|
// mmWriteProfileInt(szIni, szZOOMBY2,
|
|||
|
// (dwOptions & MCIAVIO_ZOOMBY2) ? sz1 : sz0);
|
|||
|
|
|||
|
mmWriteProfileInt(szDrawDib, szDVA,
|
|||
|
(dwOptions & MCIAVIO_USEDCI) ? sz1 : sz0);
|
|||
|
|
|||
|
////mmWriteProfileInt(szIni, szFAILIFNOWAVE,
|
|||
|
//// (dwOptions & MCIAVIO_FAILIFNOWAVE) ? sz1 : sz0);
|
|||
|
|
|||
|
// mmWriteProfileInt(szIni, szSTUPIDMODE,
|
|||
|
// (dwOptions & MCIAVIO_STUPIDMODE) ? sz1 : sz0);
|
|||
|
|
|||
|
mmWriteProfileInt(szIni, szSKIPFRAMES,
|
|||
|
(dwOptions & MCIAVIO_SKIPFRAMES) ? sz1 : sz0);
|
|||
|
|
|||
|
mmWriteProfileInt(szIni, szUSEAVIFILE,
|
|||
|
(dwOptions & MCIAVIO_USEAVIFILE) ? sz1 : sz0);
|
|||
|
|
|||
|
mmWriteProfileInt(szIni, szNOSOUND,
|
|||
|
(dwOptions & MCIAVIO_NOSOUND) ? sz1 : sz0);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
BOOL FAR PASCAL ConfigDialog(HWND hWnd, NPMCIGRAPHIC npMCI)
|
|||
|
{
|
|||
|
#define MAX_WINDOWS 10
|
|||
|
HWND hWndActive[MAX_WINDOWS];
|
|||
|
BOOL fResult = FALSE;
|
|||
|
INT ii;
|
|||
|
HWND hWndTop;
|
|||
|
HINSTANCE hInst;
|
|||
|
SHOWMMCPLPROPSHEETW fnShow;
|
|||
|
DWORD dwOptionFlags;
|
|||
|
WCHAR szCaptionW[128];
|
|||
|
WCHAR szTabW[40];
|
|||
|
UINT cchLen;
|
|||
|
|
|||
|
LoadStringW(ghModule, IDS_VIDEOCAPTION, szCaptionW, ARRAYSIZE(szCaptionW));
|
|||
|
|
|||
|
//Maybe the user is trying to get this dialog back because it is lost somewhere on
|
|||
|
//his/her desktop. Bring back to the top. (SetFocus does not work across threads).
|
|||
|
if (ghwndConfig)
|
|||
|
{
|
|||
|
BringWindowToTop(FindWindowW(NULL, szCaptionW));
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
if (hWnd == NULL)
|
|||
|
hWnd = GetActiveWindow();
|
|||
|
|
|||
|
//
|
|||
|
// Enumerate all the Top level windows of this task and disable them!
|
|||
|
//
|
|||
|
for (hWndTop = GetWindow(GetDesktopWindow(), GW_CHILD), ii=0;
|
|||
|
hWndTop && ii < MAX_WINDOWS;
|
|||
|
hWndTop = GetWindow(hWndTop, GW_HWNDNEXT)) {
|
|||
|
|
|||
|
if (IsWindowEnabled(hWndTop) &&
|
|||
|
IsWindowVisible(hWndTop) &&
|
|||
|
(HTASK)GetWindowTask(hWndTop) == GetCurrentTask() &&
|
|||
|
hWndTop != hWnd)
|
|||
|
{
|
|||
|
// don't disable our parent
|
|||
|
hWndActive[ii++] = hWndTop;
|
|||
|
EnableWindow(hWndTop, FALSE);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Don't let anyone try to bring up another config sheet
|
|||
|
//
|
|||
|
if (hWnd)
|
|||
|
ghwndConfig = hWnd;
|
|||
|
else
|
|||
|
ghwndConfig = (HWND)0x800; // just in case - make sure it's non-zero
|
|||
|
|
|||
|
//
|
|||
|
// Bring up the MCIAVI configure sheet from inside mmsys.cpl
|
|||
|
//
|
|||
|
hInst = LoadLibrary (TEXT ("mmsys.cpl"));
|
|||
|
if (hInst)
|
|||
|
{
|
|||
|
fnShow = (SHOWMMCPLPROPSHEETW)GetProcAddress(hInst, "ShowMMCPLPropertySheetW");
|
|||
|
|
|||
|
if (fnShow)
|
|||
|
{
|
|||
|
// Note: This string is not localizable
|
|||
|
static const WCHAR szVideoW[] = L"VIDEO";
|
|||
|
|
|||
|
LoadStringW(ghModule, IDS_VIDEO, szTabW, ARRAYSIZE(szTabW));
|
|||
|
fResult = fnShow(hWnd, szVideoW, szTabW, szCaptionW);
|
|||
|
|
|||
|
//
|
|||
|
// Make sure the dialog changes get picked up right away
|
|||
|
// Only change those possibly affected by the dialog.
|
|||
|
// !!! This is a little hacky; knowing which ones get changed
|
|||
|
//
|
|||
|
if (npMCI && fResult)
|
|||
|
{
|
|||
|
dwOptionFlags = ReadConfigInfo();
|
|||
|
npMCI->dwOptionFlags &= ~MCIAVIO_WINDOWSIZEMASK;
|
|||
|
npMCI->dwOptionFlags &= ~MCIAVIO_ZOOMBY2;
|
|||
|
npMCI->dwOptionFlags &= ~MCIAVIO_USEVGABYDEFAULT;
|
|||
|
npMCI->dwOptionFlags |= dwOptionFlags &
|
|||
|
(MCIAVIO_WINDOWSIZEMASK | MCIAVIO_ZOOMBY2 |
|
|||
|
MCIAVIO_USEVGABYDEFAULT);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
FreeLibrary(hInst);
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Restore all windows
|
|||
|
//
|
|||
|
while (ii-- > 0)
|
|||
|
EnableWindow(hWndActive[ii], TRUE);
|
|||
|
|
|||
|
if (hWnd)
|
|||
|
SetActiveWindow(hWnd);
|
|||
|
|
|||
|
ghwndConfig = NULL;
|
|||
|
|
|||
|
return fResult;
|
|||
|
}
|
|||
|
|
|||
|
// This function should be called only to verify that we should be using
|
|||
|
//
|
|||
|
//
|
|||
|
//
|
|||
|
|
|||
|
#ifdef _WIN32
|
|||
|
|
|||
|
TCHAR szWow32[] = TEXT("wow32.dll");
|
|||
|
CHAR szWOWUseMciavi16Proc[] = "WOWUseMciavi16";
|
|||
|
|
|||
|
typedef BOOL (*PFNWOWUSEMCIAVI16PROC)(VOID);
|
|||
|
|
|||
|
BOOL FAR PASCAL WowUseMciavi16(VOID)
|
|||
|
{
|
|||
|
HMODULE hWow32;
|
|||
|
BOOL fUseMciavi16 = FALSE;
|
|||
|
PFNWOWUSEMCIAVI16PROC pfnWOWUseMciavi16Proc;
|
|||
|
|
|||
|
if (NULL != (hWow32 = GetModuleHandle(szWow32))) {
|
|||
|
pfnWOWUseMciavi16Proc = (PFNWOWUSEMCIAVI16PROC)GetProcAddress(hWow32, szWOWUseMciavi16Proc);
|
|||
|
if (NULL != pfnWOWUseMciavi16Proc) {
|
|||
|
fUseMciavi16 = (*pfnWOWUseMciavi16Proc)();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return(fUseMciavi16);
|
|||
|
}
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
|