710 lines
22 KiB
C
710 lines
22 KiB
C
|
/******************************************************************************
|
||
|
|
||
|
Copyright (C) Microsoft Corporation 1985-1991. All rights reserved.
|
||
|
|
||
|
Title: config.c - Multimedia Systems Media Control Interface
|
||
|
driver for AVI - configuration dialog.
|
||
|
|
||
|
*****************************************************************************/
|
||
|
#include "graphic.h"
|
||
|
#include "cnfgdlg.h"
|
||
|
|
||
|
#define comptypeNONE mmioFOURCC('n','o','n','e')
|
||
|
|
||
|
#ifndef WIN32
|
||
|
#define SZCODE char _based(_segname("_CODE"))
|
||
|
#else
|
||
|
#define SZCODE TCHAR
|
||
|
#endif
|
||
|
|
||
|
SZCODE szDEFAULTVIDEO[] = TEXT("DefaultVideo");
|
||
|
SZCODE szVIDEOWINDOW[] = TEXT("Window");
|
||
|
SZCODE szVIDEO240[] = TEXT("240 Line Fullscreen");
|
||
|
SZCODE szSEEKEXACT[] = TEXT("AccurateSeek");
|
||
|
SZCODE szZOOMBY2[] = TEXT("ZoomBy2");
|
||
|
//SZCODE szSTUPIDMODE[] = TEXT("DontBufferOffscreen");
|
||
|
SZCODE szSKIPFRAMES[] = TEXT("SkipFrames");
|
||
|
SZCODE szUSEAVIFILE[] = TEXT("UseAVIFile");
|
||
|
|
||
|
SZCODE szIni[] = TEXT("MCIAVI");
|
||
|
|
||
|
SZCODE sz1[] = TEXT("1");
|
||
|
SZCODE sz0[] = TEXT("0");
|
||
|
|
||
|
SZCODE szIntl[] = TEXT("Intl");
|
||
|
SZCODE szDecimal[] = TEXT("sDecimal");
|
||
|
SZCODE szThousand[] = TEXT("sThousand");
|
||
|
|
||
|
/* Make sure we only have one configure box up at a time.... */
|
||
|
HWND ghwndConfig = NULL;
|
||
|
|
||
|
#ifdef DEBUG
|
||
|
BOOL FAR PASCAL _LOADDS DebugDlgProc(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
static NPMCIGRAPHIC npMCI = NULL;
|
||
|
HWND cb;
|
||
|
int i;
|
||
|
TCHAR ach[40];
|
||
|
|
||
|
extern int giDebugLevel; // current debug level (common.h)
|
||
|
|
||
|
switch (wMsg) {
|
||
|
case WM_INITDIALOG:
|
||
|
npMCI = (NPMCIGRAPHIC)(UINT)lParam;
|
||
|
|
||
|
//
|
||
|
// set the DEBUG stuff.
|
||
|
//
|
||
|
CheckDlgButton(hDlg, ID_SCREEN, GetProfileInt(TEXT("DrawDib"), TEXT("DecompressToScreen"), 2));
|
||
|
CheckDlgButton(hDlg, ID_BITMAP, GetProfileInt(TEXT("DrawDib"), TEXT("DecompressToBitmap"), 2));
|
||
|
CheckDlgButton(hDlg, ID_SUCKS, GetProfileInt(TEXT("DrawDib"), TEXT("DrawToBitmap"), 2));
|
||
|
CheckDlgButton(hDlg, ID_USE_AVIFILE, (npMCI->dwOptionFlags & MCIAVIO_USEAVIFILE) != 0);
|
||
|
SetScrollRange(GetDlgItem(hDlg, ID_RATE), SB_CTL, 0, 1000, TRUE);
|
||
|
SetScrollPos(GetDlgItem(hDlg, ID_RATE), SB_CTL, (int)npMCI->PlaybackRate,TRUE);
|
||
|
|
||
|
cb = GetDlgItem(hDlg, ID_LEVEL);
|
||
|
SetWindowFont(cb, GetStockObject(ANSI_VAR_FONT), FALSE);
|
||
|
|
||
|
ComboBox_AddString(cb, "0 - None");
|
||
|
ComboBox_AddString(cb, "1 - Level 1");
|
||
|
ComboBox_AddString(cb, "2 - Level 2");
|
||
|
ComboBox_AddString(cb, "3 - Level 3");
|
||
|
ComboBox_AddString(cb, "4 - Level 4");
|
||
|
|
||
|
ComboBox_SetCurSel(cb, giDebugLevel);
|
||
|
|
||
|
#include "..\verinfo\usa\verinfo.h"
|
||
|
wsprintf(ach,TEXT("Build %d.%02d.%02d"), MMVERSION, MMREVISION, MMRELEASE);
|
||
|
SetDlgItemText(hDlg, ID_BUILD, ach);
|
||
|
|
||
|
return TRUE;
|
||
|
|
||
|
case WM_HSCROLL:
|
||
|
i = GetScrollPos((HWND)HIWORD(lParam),SB_CTL);
|
||
|
|
||
|
switch (LOWORD(wParam)) {
|
||
|
case SB_LINEDOWN: i+=10; break;
|
||
|
case SB_LINEUP: i-=10; break;
|
||
|
case SB_PAGEDOWN: i+=100; break;
|
||
|
case SB_PAGEUP: i-=100; break;
|
||
|
case SB_THUMBTRACK:
|
||
|
case SB_THUMBPOSITION: i = LOWORD(lParam); break;
|
||
|
}
|
||
|
|
||
|
if (i<0) i=0;
|
||
|
if (i>1000) i=1000;
|
||
|
|
||
|
SetScrollPos((HWND)HIWORD(lParam),SB_CTL,i,TRUE);
|
||
|
break;
|
||
|
|
||
|
case WM_COMMAND:
|
||
|
switch (wParam) {
|
||
|
case IDCANCEL:
|
||
|
case IDOK:
|
||
|
i = IsDlgButtonChecked(hDlg, ID_SUCKS);
|
||
|
if (i == 2)
|
||
|
WriteProfileString(TEXT("DrawDib"), TEXT("DrawToBitmap"), NULL);
|
||
|
else
|
||
|
WriteProfileString(TEXT("DrawDib"), TEXT("DrawToBitmap"), (LPTSTR)(i ? sz1 : sz0));
|
||
|
|
||
|
i = IsDlgButtonChecked(hDlg, ID_SCREEN);
|
||
|
if (i == 2)
|
||
|
WriteProfileString(TEXT("DrawDib"), TEXT("DecompressToScreen"),NULL);
|
||
|
else
|
||
|
WriteProfileString(TEXT("DrawDib"), TEXT("DecompressToScreen"),(LPTSTR)(i ? sz1 : sz0));
|
||
|
|
||
|
i = IsDlgButtonChecked(hDlg, ID_BITMAP);
|
||
|
if (i == 2)
|
||
|
WriteProfileString(TEXT("DrawDib"), TEXT("DecompressToBitmap"),NULL);
|
||
|
else
|
||
|
WriteProfileString(TEXT("DrawDib"), TEXT("DecompressToBitmap"),(LPTSTR)(i ? sz1 : sz0));
|
||
|
|
||
|
npMCI->PlaybackRate = GetScrollPos(GetDlgItem(hDlg, ID_RATE), SB_CTL);
|
||
|
|
||
|
giDebugLevel = ComboBox_GetCurSel(GetDlgItem(hDlg, ID_LEVEL));
|
||
|
wsprintf(ach,TEXT("%d"),giDebugLevel);
|
||
|
WriteProfileString(TEXT("Debug"),TEXT("MCIAVI"),ach);
|
||
|
|
||
|
if (IsDlgButtonChecked(hDlg, ID_USE_AVIFILE))
|
||
|
npMCI->dwOptionFlags |= MCIAVIO_USEAVIFILE;
|
||
|
else
|
||
|
npMCI->dwOptionFlags &= ~MCIAVIO_USEAVIFILE;
|
||
|
|
||
|
EndDialog(hDlg, TRUE);
|
||
|
break;
|
||
|
|
||
|
case ID_RATE:
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
return FALSE;
|
||
|
}
|
||
|
#endif // DEBUG
|
||
|
|
||
|
LONG AVIGetFileSize(LPTSTR szFile)
|
||
|
{
|
||
|
LONG lSize;
|
||
|
|
||
|
#ifdef WIN32
|
||
|
DWORD dwHigh;
|
||
|
HANDLE fh;
|
||
|
fh = CreateFile(szFile, GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ,
|
||
|
NULL, OPEN_EXISTING, 0, 0);
|
||
|
|
||
|
if (fh == (HANDLE)HFILE_ERROR)
|
||
|
return 0;
|
||
|
|
||
|
lSize = (LONG)GetFileSize(fh, &dwHigh);
|
||
|
CloseHandle(fh);
|
||
|
#else
|
||
|
OFSTRUCT of;
|
||
|
HFILE fh;
|
||
|
fh = OpenFile(szFile, &of, OF_READ | OF_SHARE_DENY_NONE);
|
||
|
|
||
|
if (fh == HFILE_ERROR)
|
||
|
fh = OpenFile(szFile, &of, OF_READ);
|
||
|
|
||
|
if (fh == HFILE_ERROR)
|
||
|
return 0;
|
||
|
|
||
|
lSize = _llseek(fh, 0, SEEK_END);
|
||
|
_lclose(fh);
|
||
|
#endif
|
||
|
|
||
|
return lSize;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
//fill in the info box.
|
||
|
//
|
||
|
BOOL ConfigInfo(NPMCIGRAPHIC npMCI, HWND hwnd)
|
||
|
{
|
||
|
PTSTR pchInfo;
|
||
|
LONG len;
|
||
|
DWORD time;
|
||
|
PTSTR pch;
|
||
|
TCHAR ach[80];
|
||
|
TCHAR achDecimal[4];
|
||
|
TCHAR achThousand[4];
|
||
|
int i;
|
||
|
|
||
|
if (npMCI == NULL)
|
||
|
return FALSE;
|
||
|
|
||
|
achDecimal[0] = '.'; achDecimal[1] = 0;
|
||
|
achThousand[0] = ','; achThousand[1] = 0;
|
||
|
|
||
|
GetProfileString(szIntl, szDecimal, achDecimal, achDecimal, sizeof(achDecimal));
|
||
|
GetProfileString(szIntl, szThousand, achThousand, achThousand, sizeof(achThousand));
|
||
|
|
||
|
pchInfo = (PTSTR)LocalAlloc(LPTR, 8192*sizeof(TCHAR));
|
||
|
|
||
|
if (pchInfo == NULL)
|
||
|
return FALSE;
|
||
|
|
||
|
pch = pchInfo;
|
||
|
|
||
|
//
|
||
|
// display file name
|
||
|
//
|
||
|
// File: full path.
|
||
|
//
|
||
|
LoadString(ghModule, INFO_FILE, ach, sizeof(ach));
|
||
|
pch += wsprintf(pch, ach, (LPTSTR)npMCI->szFilename);
|
||
|
|
||
|
//
|
||
|
// display file type
|
||
|
//
|
||
|
// Type: type
|
||
|
//
|
||
|
if (npMCI->pf) {
|
||
|
#ifdef USEAVIFILE
|
||
|
AVIFILEINFO info;
|
||
|
LoadString(ghModule, INFO_FILETYPE, ach, sizeof(ach));
|
||
|
npMCI->pf->lpVtbl->Info(npMCI->pf, &info, sizeof(info));
|
||
|
pch += wsprintf(pch, ach, (LPSTR)info.szFileType);
|
||
|
#endif
|
||
|
}
|
||
|
else if (npMCI->dwFlags & MCIAVI_NOTINTERLEAVED) {
|
||
|
LoadString(ghModule, INFO_FILETYPE_AVI, pch, 80);
|
||
|
pch += lstrlen(pch);
|
||
|
}
|
||
|
else {
|
||
|
LoadString(ghModule, INFO_FILETYPE_INT, pch, 80);
|
||
|
pch += lstrlen(pch);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// display length
|
||
|
//
|
||
|
// Length: ## Frames (#.## sec)
|
||
|
//
|
||
|
LoadString(ghModule, INFO_LENGTH, ach, sizeof(ach));
|
||
|
|
||
|
time = muldivru32(npMCI->lFrames, npMCI->dwMicroSecPerFrame, 1000L);
|
||
|
|
||
|
pch += wsprintf(pch, ach,
|
||
|
npMCI->lFrames, time/1000, achDecimal[0], (int)(time%1000));
|
||
|
|
||
|
//
|
||
|
// display the average data rate
|
||
|
//
|
||
|
// Data Rate: #k/sec
|
||
|
//
|
||
|
len = npMCI->dwBigListEnd - npMCI->dwMovieListOffset;
|
||
|
|
||
|
if (len == 0)
|
||
|
len = AVIGetFileSize(npMCI->szFilename);
|
||
|
|
||
|
if (len > 0) {
|
||
|
LoadString(ghModule, INFO_DATARATE, ach, sizeof(ach));
|
||
|
pch += wsprintf(pch, ach,muldiv32(len,1000,time) / 1024);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// dump info on each stream.
|
||
|
//
|
||
|
for (i=0; i<npMCI->streams; i++) {
|
||
|
|
||
|
STREAMINFO *psi = SI(i);
|
||
|
|
||
|
LONG rate = muldiv32(psi->sh.dwRate,1000,psi->sh.dwScale);
|
||
|
|
||
|
//
|
||
|
// display video format
|
||
|
//
|
||
|
// Video: MSVC 160x120x8 (cram) 15.000 fps
|
||
|
//
|
||
|
if (psi->lpFormat && psi->sh.fccType == streamtypeVIDEO) {
|
||
|
|
||
|
LPBITMAPINFOHEADER lpbi = (LPBITMAPINFOHEADER)psi->lpFormat;
|
||
|
|
||
|
DWORD fccHandler = psi->sh.fccHandler;
|
||
|
DWORD fccFormat = lpbi->biCompression;
|
||
|
|
||
|
if (fccHandler == 0) fccHandler = comptypeNONE;
|
||
|
if (fccHandler == BI_RLE8) fccHandler = comptypeRLE;
|
||
|
|
||
|
if (fccFormat == 0) fccFormat = comptypeNONE;
|
||
|
if (fccFormat == BI_RLE8) fccFormat = comptypeRLE;
|
||
|
|
||
|
LoadString(ghModule, INFO_VIDEOFORMAT, ach, sizeof(ach));
|
||
|
|
||
|
pch += wsprintf(pch, ach,
|
||
|
(LPVOID)&fccHandler,
|
||
|
(int)lpbi->biWidth,
|
||
|
(int)lpbi->biHeight,
|
||
|
(int)lpbi->biBitCount,
|
||
|
(LPVOID)&fccFormat,
|
||
|
(UINT)(rate/1000), achDecimal[0], (UINT)(rate%1000));
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// display audio format
|
||
|
//
|
||
|
// Audio: Mono 11.024KHz 8bit
|
||
|
//
|
||
|
else if (psi->lpFormat && psi->sh.fccType == streamtypeAUDIO) {
|
||
|
|
||
|
LPWAVEFORMAT pwf = (LPWAVEFORMAT)psi->lpFormat;
|
||
|
|
||
|
if (pwf->nChannels == 1)
|
||
|
LoadString(ghModule, INFO_MONOFORMAT, ach, sizeof(ach));
|
||
|
else
|
||
|
LoadString(ghModule, INFO_STEREOFORMAT, ach, sizeof(ach));
|
||
|
|
||
|
pch += wsprintf(pch, ach,
|
||
|
(int)(pwf->nSamplesPerSec/1000),achDecimal[0],
|
||
|
(int)(pwf->nSamplesPerSec%1000),
|
||
|
(int)(pwf->nAvgBytesPerSec * 8 / (pwf->nSamplesPerSec * pwf->nChannels)));
|
||
|
|
||
|
if (pwf->wFormatTag == WAVE_FORMAT_PCM) {
|
||
|
}
|
||
|
|
||
|
else if (pwf->wFormatTag == 2) { // ADPCM
|
||
|
pch -= 2; // skip over \r\n
|
||
|
LoadString(ghModule, INFO_ADPCM, pch, 20);
|
||
|
pch += lstrlen(pch);
|
||
|
}
|
||
|
|
||
|
else {
|
||
|
pch -= 2; // skip over \r\n
|
||
|
LoadString(ghModule, INFO_COMPRESSED, pch, 20);
|
||
|
pch += lstrlen(pch);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Other stream.
|
||
|
//
|
||
|
else if (psi->sh.fccType != 0) {
|
||
|
|
||
|
LoadString(ghModule, INFO_STREAM, ach, sizeof(ach));
|
||
|
|
||
|
pch += wsprintf(pch, ach,
|
||
|
(LPSTR)&psi->sh.fccType,
|
||
|
(LPSTR)&psi->sh.fccHandler);
|
||
|
}
|
||
|
|
||
|
if (!(psi->dwFlags & STREAM_ENABLED)) {
|
||
|
pch -= 2; // skip over \r\n
|
||
|
LoadString(ghModule, INFO_DISABLED, ach, sizeof(ach));
|
||
|
pch += wsprintf(pch, ach);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#ifdef DEBUG
|
||
|
//
|
||
|
// show the frames skipped on the last play
|
||
|
//
|
||
|
if (npMCI->lFramesPlayed > 0) {
|
||
|
LoadString(ghModule, INFO_SKIP, ach, sizeof(ach));
|
||
|
pch += wsprintf(pch, ach,
|
||
|
npMCI->lSkippedFrames,
|
||
|
npMCI->lFramesPlayed,
|
||
|
(int)(100L * npMCI->lSkippedFrames / npMCI->lFramesPlayed));
|
||
|
|
||
|
//
|
||
|
// show the frames not read on the last play
|
||
|
//
|
||
|
if (npMCI->lFramesSeekedPast > 0) {
|
||
|
LoadString(ghModule, INFO_NOTREAD, ach, sizeof(ach));
|
||
|
pch += wsprintf(pch, ach,
|
||
|
npMCI->lFramesSeekedPast,
|
||
|
(int)(100L * npMCI->lFramesSeekedPast / npMCI->lFramesPlayed));
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// show the # audio breaks on the last play
|
||
|
//
|
||
|
if (npMCI->lFramesPlayed > 0 && npMCI->lAudioBreaks > 0) {
|
||
|
LoadString(ghModule, INFO_SKIPAUDIO, ach, sizeof(ach));
|
||
|
pch += wsprintf(pch, ach, npMCI->lAudioBreaks);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
if (npMCI->dwKeyFrameInfo == 1) {
|
||
|
LoadString(ghModule, INFO_ALLKEYFRAMES, ach, sizeof(ach));
|
||
|
pch += wsprintf(pch, ach, (int)npMCI->dwKeyFrameInfo);
|
||
|
}
|
||
|
else if (npMCI->dwKeyFrameInfo == 0) {
|
||
|
LoadString(ghModule, INFO_NOKEYFRAMES, ach, sizeof(ach));
|
||
|
pch += wsprintf(pch, ach, (int)npMCI->dwKeyFrameInfo);
|
||
|
}
|
||
|
else {
|
||
|
LoadString(ghModule, INFO_KEYFRAMES, ach, sizeof(ach));
|
||
|
pch += wsprintf(pch, ach, (int)npMCI->dwKeyFrameInfo);
|
||
|
}
|
||
|
|
||
|
#ifdef DEBUG
|
||
|
//
|
||
|
// timing info
|
||
|
//
|
||
|
#define SEC(time) (UINT)(time / 1000l) , (UINT)(time % 1000l)
|
||
|
#define SECX(time,t) SEC(time) , (t ? (UINT)(time * 100l / t) : 0)
|
||
|
|
||
|
if (npMCI->lFramesPlayed > 0) {
|
||
|
|
||
|
DRAWDIBTIME ddt;
|
||
|
|
||
|
pch += wsprintf(pch, TEXT("MCIAVI-------------------------------------\r\n"));
|
||
|
pch += wsprintf(pch, TEXT("timePlay: \t%3d.%03dsec\r\n"),SEC(npMCI->timePlay));
|
||
|
pch += wsprintf(pch, TEXT("timeRead: \t%3d.%03dsec (%d%%)\r\n"),SECX(npMCI->timeRead, npMCI->timePlay));
|
||
|
pch += wsprintf(pch, TEXT("timeWait: \t%3d.%03dsec (%d%%)\r\n"),SECX(npMCI->timeWait, npMCI->timePlay));
|
||
|
pch += wsprintf(pch, TEXT("timeYield: \t%3d.%03dsec (%d%%)\r\n"),SECX(npMCI->timeYield, npMCI->timePlay));
|
||
|
pch += wsprintf(pch, TEXT("timeVideo: \t%3d.%03dsec (%d%%)\r\n"),SECX(npMCI->timeVideo, npMCI->timePlay));
|
||
|
pch += wsprintf(pch, TEXT("timeDraw: \t%3d.%03dsec (%d%%)\r\n"),SECX(npMCI->timeDraw, npMCI->timePlay));
|
||
|
pch += wsprintf(pch, TEXT("timeDecomp: \t%3d.%03dsec (%d%%)\r\n"),SECX(npMCI->timeDecompress, npMCI->timePlay));
|
||
|
pch += wsprintf(pch, TEXT("timeAudio: \t%3d.%03dsec (%d%%)\r\n"),SECX(npMCI->timeAudio, npMCI->timePlay));
|
||
|
pch += wsprintf(pch, TEXT("timePaused: \t%3d.%03dsec\r\n"),SEC(npMCI->timePaused));
|
||
|
pch += wsprintf(pch, TEXT("timePrepare: \t%3d.%03dsec\r\n"),SEC(npMCI->timePrepare));
|
||
|
pch += wsprintf(pch, TEXT("timeCleanup: \t%3d.%03dsec\r\n"),SEC(npMCI->timeCleanup));
|
||
|
|
||
|
if (npMCI->hdd && DrawDibTime(npMCI->hdd, &ddt)) {
|
||
|
pch += wsprintf(pch, TEXT("DrawDib-------------------------------------\r\n"));
|
||
|
pch += wsprintf(pch, TEXT("timeDraw: \t%3d.%03dsec\r\n"), SEC(ddt.timeDraw));
|
||
|
pch += wsprintf(pch, TEXT("timeDecompress: \t%3d.%03dsec (%d%%)\r\n"), SECX(ddt.timeDecompress, ddt.timeDraw));
|
||
|
pch += wsprintf(pch, TEXT("timeDither: \t%3d.%03dsec (%d%%)\r\n"), SECX(ddt.timeDither, ddt.timeDraw));
|
||
|
pch += wsprintf(pch, TEXT("timeStretch: \t%3d.%03dsec (%d%%)\r\n"), SECX(ddt.timeStretch, ddt.timeDraw));
|
||
|
pch += wsprintf(pch, TEXT("timeSetDIBits: \t%3d.%03dsec (%d%%)\r\n"), SECX(ddt.timeSetDIBits, ddt.timeDraw));
|
||
|
pch += wsprintf(pch, TEXT("timeBlt: \t%3d.%03dsec (%d%%)\r\n"), SECX(ddt.timeBlt, ddt.timeDraw));
|
||
|
}
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
//
|
||
|
// now shove this mess into the info window.
|
||
|
//
|
||
|
Assert(pch - pchInfo < 8192);
|
||
|
SetWindowFont(GetDlgItem(hwnd, ID_INFO), GetStockObject(ANSI_VAR_FONT), TRUE);
|
||
|
SetDlgItemText(hwnd, ID_INFO, pchInfo);
|
||
|
|
||
|
LocalFree((HLOCAL)pchInfo);
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
BOOL FAR PASCAL _LOADDS ConfigDlgProc(HWND hDlg, UINT wMsg,
|
||
|
WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
static NPMCIGRAPHIC npMCI = NULL;
|
||
|
DWORD dwOptions;
|
||
|
TCHAR ach[80];
|
||
|
|
||
|
switch (wMsg) {
|
||
|
case WM_INITDIALOG:
|
||
|
npMCI = (NPMCIGRAPHIC)(UINT)lParam;
|
||
|
ghwndConfig = hDlg;
|
||
|
|
||
|
if (npMCI)
|
||
|
dwOptions = npMCI->dwOptionFlags;
|
||
|
else
|
||
|
dwOptions = ReadConfigInfo();
|
||
|
|
||
|
#ifndef WIN32
|
||
|
// On NT we do not support full screen. I wonder if this
|
||
|
// will ever change ?
|
||
|
CheckRadioButton(hDlg, ID_WINDOW, ID_VGA240,
|
||
|
(dwOptions & MCIAVIO_USEVGABYDEFAULT) ?
|
||
|
ID_VGA240 : ID_WINDOW);
|
||
|
#endif
|
||
|
|
||
|
CheckDlgButton(hDlg, ID_ZOOM2,
|
||
|
(dwOptions & MCIAVIO_ZOOMBY2) != 0);
|
||
|
|
||
|
CheckDlgButton(hDlg, ID_SKIPFRAMES,
|
||
|
(dwOptions & MCIAVIO_SKIPFRAMES) != 0);
|
||
|
|
||
|
#if 0 /////////////////////////////////////////////////////////////////////
|
||
|
CheckDlgButton(hDlg, ID_FAILIFNOWAVE,
|
||
|
(dwOptions & MCIAVIO_FAILIFNOWAVE) != 0);
|
||
|
|
||
|
CheckDlgButton(hDlg, ID_SEEKEXACT,
|
||
|
(dwOptions & MCIAVIO_SEEKEXACT) == 0);
|
||
|
#endif /////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
// CheckDlgButton(hDlg, ID_STUPIDMODE,
|
||
|
// (dwOptions & MCIAVIO_STUPIDMODE) != 0);
|
||
|
|
||
|
EnableWindow(GetDlgItem(hDlg, ID_ZOOM2), TRUE);
|
||
|
// (dwOptions & MCIAVIO_STUPIDMODE) == 0);
|
||
|
|
||
|
if (npMCI == NULL) {
|
||
|
GetDlgItemText(hDlg, ID_DEFAULT, ach, sizeof(ach)/sizeof(TCHAR));
|
||
|
SetDlgItemText(hDlg, IDOK, ach);
|
||
|
ShowWindow(GetDlgItem(hDlg, ID_DEFAULT),SW_HIDE);
|
||
|
}
|
||
|
|
||
|
if (!ConfigInfo(npMCI, hDlg)) {
|
||
|
RECT rcWindow;
|
||
|
RECT rc;
|
||
|
|
||
|
GetWindowRect(hDlg, &rcWindow);
|
||
|
GetWindowRect(GetDlgItem(hDlg, ID_SIZE), &rc);
|
||
|
|
||
|
SetWindowPos(hDlg, NULL, 0, 0,
|
||
|
rcWindow.right-rcWindow.left,
|
||
|
rc.top - rcWindow.top,
|
||
|
SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE);
|
||
|
}
|
||
|
return TRUE;
|
||
|
|
||
|
case WM_ENDSESSION:
|
||
|
if (wParam)
|
||
|
EndDialog(hDlg, FALSE);
|
||
|
break;
|
||
|
|
||
|
case WM_COMMAND:
|
||
|
switch (wParam) {
|
||
|
case ID_DEFAULT:
|
||
|
case IDOK:
|
||
|
if (npMCI)
|
||
|
dwOptions = npMCI->dwOptionFlags;
|
||
|
else
|
||
|
dwOptions = 0;
|
||
|
|
||
|
/* Clear the flags we might set */
|
||
|
|
||
|
dwOptions &= ~(MCIAVIO_USEVGABYDEFAULT |
|
||
|
MCIAVIO_SKIPFRAMES |
|
||
|
//// MCIAVIO_FAILIFNOWAVE |
|
||
|
//// MCIAVIO_SEEKEXACT |
|
||
|
MCIAVIO_ZOOMBY2 |
|
||
|
MCIAVIO_STUPIDMODE);
|
||
|
|
||
|
#ifndef WIN32
|
||
|
// On NT we do not support full screen. I wonder if this
|
||
|
// will ever change ?
|
||
|
if (!IsDlgButtonChecked(hDlg, ID_WINDOW))
|
||
|
dwOptions |= MCIAVIO_USEVGABYDEFAULT;
|
||
|
#endif
|
||
|
|
||
|
if (IsDlgButtonChecked(hDlg, ID_SKIPFRAMES))
|
||
|
dwOptions |= MCIAVIO_SKIPFRAMES;
|
||
|
|
||
|
//// if (IsDlgButtonChecked(hDlg, ID_FAILIFNOWAVE))
|
||
|
//// dwOptions |= MCIAVIO_FAILIFNOWAVE;
|
||
|
|
||
|
//// if (!IsDlgButtonChecked(hDlg, ID_SEEKEXACT))
|
||
|
dwOptions |= MCIAVIO_SEEKEXACT;
|
||
|
|
||
|
// if (IsDlgButtonChecked(hDlg, ID_STUPIDMODE))
|
||
|
// dwOptions |= MCIAVIO_STUPIDMODE;
|
||
|
//
|
||
|
// else if (IsDlgButtonChecked(hDlg, ID_ZOOM2))
|
||
|
if (IsDlgButtonChecked(hDlg, ID_ZOOM2))
|
||
|
dwOptions |= MCIAVIO_ZOOMBY2;
|
||
|
|
||
|
if (wParam == ID_DEFAULT || npMCI == NULL)
|
||
|
WriteConfigInfo(dwOptions);
|
||
|
|
||
|
if (wParam == IDOK) {
|
||
|
|
||
|
if (npMCI)
|
||
|
npMCI->dwOptionFlags = dwOptions;
|
||
|
|
||
|
EndDialog(hDlg, TRUE);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
// case ID_STUPIDMODE:
|
||
|
// EnableWindow(GetDlgItem(hDlg, ID_ZOOM2),
|
||
|
// !IsDlgButtonChecked(hDlg, ID_STUPIDMODE));
|
||
|
//
|
||
|
// /* Clear "zoom" if easy mode checked */
|
||
|
// if (IsDlgButtonChecked(hDlg, ID_STUPIDMODE))
|
||
|
// CheckDlgButton(hDlg, ID_ZOOM2, FALSE);
|
||
|
// break;
|
||
|
|
||
|
case IDCANCEL:
|
||
|
EndDialog(hDlg, FALSE);
|
||
|
break;
|
||
|
#ifdef DEBUG
|
||
|
case ID_DEBUG:
|
||
|
DialogBoxParam(ghModule, MAKEINTRESOURCE(IDA_DEBUG),
|
||
|
hDlg, DebugDlgProc, (DWORD)(UINT)npMCI);
|
||
|
break;
|
||
|
#endif
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
DWORD FAR PASCAL ReadConfigInfo(void)
|
||
|
{
|
||
|
int i;
|
||
|
DWORD dwOptions = 0L;
|
||
|
HDC hdc;
|
||
|
//
|
||
|
// ask the display device if it can do 256 color.
|
||
|
//
|
||
|
hdc = GetDC(NULL);
|
||
|
i = GetDeviceCaps(hdc, BITSPIXEL) * GetDeviceCaps(hdc, PLANES);
|
||
|
ReleaseDC(NULL, hdc);
|
||
|
|
||
|
i = GetProfileInt(szIni, szDEFAULTVIDEO,
|
||
|
(i < 8 && (GetWinFlags() & WF_CPU286)) ? 240 : 0);
|
||
|
|
||
|
if (i >= 200)
|
||
|
dwOptions |= MCIAVIO_USEVGABYDEFAULT;
|
||
|
|
||
|
////if (GetProfileInt(szIni, szSEEKEXACT, 1))
|
||
|
dwOptions |= MCIAVIO_SEEKEXACT;
|
||
|
|
||
|
if (GetProfileInt(szIni, szZOOMBY2, 0))
|
||
|
dwOptions |= MCIAVIO_ZOOMBY2;
|
||
|
|
||
|
////if (GetProfileInt(szIni, szFAILIFNOWAVE, 0))
|
||
|
//// dwOptions |= MCIAVIO_FAILIFNOWAVE;
|
||
|
|
||
|
// if (GetProfileInt(szIni, szSTUPIDMODE, 0))
|
||
|
// dwOptions |= MCIAVIO_STUPIDMODE;
|
||
|
|
||
|
if (GetProfileInt(szIni, szSKIPFRAMES, 1))
|
||
|
dwOptions |= MCIAVIO_SKIPFRAMES;
|
||
|
|
||
|
if (GetProfileInt(szIni, szUSEAVIFILE, 0))
|
||
|
dwOptions |= MCIAVIO_USEAVIFILE;
|
||
|
|
||
|
return dwOptions;
|
||
|
}
|
||
|
|
||
|
void FAR PASCAL WriteConfigInfo(DWORD dwOptions)
|
||
|
{
|
||
|
// !!! This shouldn't get written out if it is the default!
|
||
|
WriteProfileString(szIni, szDEFAULTVIDEO,
|
||
|
(dwOptions & MCIAVIO_USEVGABYDEFAULT) ? szVIDEO240 : szVIDEOWINDOW);
|
||
|
|
||
|
////WriteProfileString(szIni, szSEEKEXACT,
|
||
|
//// (dwOptions & MCIAVIO_SEEKEXACT) ? sz1 : sz0);
|
||
|
|
||
|
WriteProfileString(szIni, szZOOMBY2,
|
||
|
(dwOptions & MCIAVIO_ZOOMBY2) ? sz1 : sz0);
|
||
|
|
||
|
////WriteProfileString(szIni, szFAILIFNOWAVE,
|
||
|
//// (dwOptions & MCIAVIO_FAILIFNOWAVE) ? sz1 : sz0);
|
||
|
|
||
|
// WriteProfileString(szIni, szSTUPIDMODE,
|
||
|
// (dwOptions & MCIAVIO_STUPIDMODE) ? sz1 : sz0);
|
||
|
|
||
|
WriteProfileString(szIni, szSKIPFRAMES,
|
||
|
(dwOptions & MCIAVIO_SKIPFRAMES) ? sz1 : sz0);
|
||
|
|
||
|
WriteProfileString(szIni, szUSEAVIFILE,
|
||
|
(dwOptions & MCIAVIO_USEAVIFILE) ? sz1 : sz0);
|
||
|
}
|
||
|
|
||
|
BOOL FAR PASCAL ConfigDialog(HWND hwnd, NPMCIGRAPHIC npMCI)
|
||
|
{
|
||
|
#define MAX_WINDOWS 10
|
||
|
HWND hwndActive[MAX_WINDOWS];
|
||
|
BOOL f;
|
||
|
int i;
|
||
|
HWND hwndT;
|
||
|
|
||
|
if (ghwndConfig) {
|
||
|
MessageBeep(0);
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
if (hwnd == NULL)
|
||
|
hwnd = GetActiveWindow();
|
||
|
|
||
|
//
|
||
|
// enum all the toplevel windows of this task and disable them!
|
||
|
//
|
||
|
for (hwndT = GetWindow(GetDesktopWindow(), GW_CHILD), i=0;
|
||
|
hwndT && i < MAX_WINDOWS;
|
||
|
hwndT = GetWindow(hwndT, GW_HWNDNEXT)) {
|
||
|
|
||
|
if (IsWindowEnabled(hwndT) &&
|
||
|
IsWindowVisible(hwndT) &&
|
||
|
(HTASK)GetWindowTask(hwndT) == GetCurrentTask() &&
|
||
|
hwndT != hwnd) { // don't disable our parent
|
||
|
hwndActive[i++] = hwndT;
|
||
|
EnableWindow(hwndT, FALSE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
f = DialogBoxParam(ghModule, MAKEINTRESOURCE(IDA_CONFIG),
|
||
|
hwnd, ConfigDlgProc, (DWORD)(UINT)npMCI);
|
||
|
|
||
|
//
|
||
|
// restore all windows
|
||
|
//
|
||
|
while (i-- > 0)
|
||
|
EnableWindow(hwndActive[i], TRUE);
|
||
|
|
||
|
if (hwnd)
|
||
|
SetActiveWindow(hwnd);
|
||
|
|
||
|
ghwndConfig = NULL;
|
||
|
|
||
|
return f;
|
||
|
}
|