235 lines
6 KiB
C
235 lines
6 KiB
C
/****************************************************************************
|
||
*
|
||
* capmisc.c
|
||
*
|
||
* Miscellaneous status and error routines.
|
||
*
|
||
* Microsoft Video for Windows Sample Capture Class
|
||
*
|
||
* Copyright (c) 1992, 1993 Microsoft Corporation. All Rights Reserved.
|
||
*
|
||
* You have a royalty-free right to use, modify, reproduce and
|
||
* distribute the Sample Files (and/or any modified version) in
|
||
* any way you find useful, provided that you agree that
|
||
* Microsoft has no warranty obligations or liability for any
|
||
* Sample Application Files which are modified.
|
||
*
|
||
***************************************************************************/
|
||
|
||
#include <windows.h>
|
||
#include <windowsx.h>
|
||
#include <mmsystem.h>
|
||
#include <msvideo.h>
|
||
#include <drawdib.h>
|
||
#include "avicap.h"
|
||
#include "avicapi.h"
|
||
|
||
static char szNull[] = "";
|
||
|
||
/*
|
||
*
|
||
* GetKey
|
||
* Peek into the message que and get a keystroke
|
||
*
|
||
*/
|
||
WORD GetKey(BOOL fWait)
|
||
{
|
||
MSG msg;
|
||
|
||
msg.wParam = 0;
|
||
|
||
if (fWait)
|
||
GetMessage(&msg, NULL, WM_KEYFIRST, WM_KEYLAST);
|
||
|
||
while(PeekMessage(&msg, NULL, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE|PM_NOYIELD))
|
||
;
|
||
return msg.wParam;
|
||
}
|
||
|
||
|
||
// wID is the string resource, which can be a format string
|
||
void FAR _cdecl statusUpdateStatus (LPCAPSTREAM lpcs, WORD wID, ...)
|
||
{
|
||
char ach[256];
|
||
char szFmt[132];
|
||
int j, k;
|
||
BOOL fHasFormatChars = FALSE;
|
||
|
||
if (lpcs-> CallbackOnStatus) {
|
||
if (wID == NULL) {
|
||
if (lpcs->fLastStatusWasNULL) // No need to send NULL twice in a row
|
||
return;
|
||
lpcs->fLastStatusWasNULL = TRUE;
|
||
lstrcpy (ach, szNull);
|
||
}
|
||
else if (!LoadString(lpcs->hInst, wID, szFmt, sizeof (szFmt))) {
|
||
lpcs->fLastStatusWasNULL = FALSE;
|
||
MessageBeep (0);
|
||
return;
|
||
}
|
||
else {
|
||
lpcs->fLastStatusWasNULL = FALSE;
|
||
k = lstrlen (szFmt);
|
||
for (j = 0; j < k; j++) {
|
||
if (szFmt[j] == '%') {
|
||
fHasFormatChars = TRUE;
|
||
break;
|
||
}
|
||
}
|
||
if (fHasFormatChars)
|
||
wvsprintf(ach, szFmt, (LPSTR)(((WORD FAR *)&wID) + 1));
|
||
else
|
||
lstrcpy (ach, szFmt);
|
||
}
|
||
|
||
(*(lpcs->CallbackOnStatus)) (lpcs->hwnd, wID, ach);
|
||
}
|
||
}
|
||
|
||
// wID is the string resource, which can be a format string
|
||
void FAR _cdecl errorUpdateError (LPCAPSTREAM lpcs, WORD wID, ...)
|
||
{
|
||
char ach[256];
|
||
char szFmt[132];
|
||
int j, k;
|
||
BOOL fHasFormatChars = FALSE;
|
||
|
||
lpcs->dwReturn = wID;
|
||
|
||
if (lpcs-> CallbackOnError) {
|
||
if (wID == NULL) {
|
||
if (lpcs->fLastErrorWasNULL) // No need to send NULL twice in a row
|
||
return;
|
||
lpcs->fLastErrorWasNULL = TRUE;
|
||
lstrcpy (ach, szNull);
|
||
}
|
||
else if (!LoadString(lpcs->hInst, wID, szFmt, sizeof (szFmt))) {
|
||
MessageBeep (0);
|
||
lpcs->fLastErrorWasNULL = FALSE;
|
||
return;
|
||
}
|
||
else {
|
||
lpcs->fLastErrorWasNULL = FALSE;
|
||
k = lstrlen (szFmt);
|
||
for (j = 0; j < k; j++) {
|
||
if (szFmt[j] == '%') {
|
||
fHasFormatChars = TRUE;
|
||
break;
|
||
}
|
||
}
|
||
if (fHasFormatChars)
|
||
wvsprintf(ach, szFmt, (LPSTR)(((WORD FAR *)&wID) + 1));
|
||
else
|
||
lstrcpy (ach, szFmt);
|
||
}
|
||
|
||
(*(lpcs->CallbackOnError)) (lpcs->hwnd, wID, ach);
|
||
}
|
||
}
|
||
|
||
// Callback client with ID of driver error msg
|
||
void errorDriverID (LPCAPSTREAM lpcs, DWORD dwError)
|
||
{
|
||
char ach[132];
|
||
|
||
lpcs->fLastErrorWasNULL = FALSE;
|
||
lpcs->dwReturn = dwError;
|
||
|
||
if (lpcs-> CallbackOnError) {
|
||
if (!dwError)
|
||
lstrcpy (ach, szNull);
|
||
else {
|
||
videoGetErrorText (lpcs->hVideoIn,
|
||
(UINT)dwError, ach, sizeof(ach));
|
||
}
|
||
(*(lpcs->CallbackOnError)) (lpcs->hwnd, IDS_CAP_DRIVER_ERROR, ach);
|
||
}
|
||
}
|
||
|
||
|
||
#ifdef _DEBUG
|
||
|
||
void FAR cdecl dprintf(LPSTR szFormat, ...)
|
||
{
|
||
char ach[128];
|
||
|
||
static BOOL fDebug = -1;
|
||
|
||
if (fDebug == -1)
|
||
fDebug = GetProfileInt("Debug", "AVICAP", FALSE);
|
||
|
||
if (!fDebug)
|
||
return;
|
||
|
||
lstrcpy(ach, "AVICAP: ");
|
||
wvsprintf(ach+8,szFormat,(LPSTR)(&szFormat+1));
|
||
lstrcat(ach, "\r\n");
|
||
|
||
OutputDebugString(ach);
|
||
}
|
||
|
||
/* _Assert(fExpr, szFile, iLine)
|
||
*
|
||
* If <fExpr> is TRUE, then do nothing. If <fExpr> is FALSE, then display
|
||
* an "assertion failed" message box allowing the user to abort the program,
|
||
* enter the debugger (the "Retry" button), or igore the error.
|
||
*
|
||
* <szFile> is the name of the source file; <iLine> is the line number
|
||
* containing the _Assert() call.
|
||
*/
|
||
#pragma optimize("", off)
|
||
BOOL FAR PASCAL
|
||
_Assert(BOOL fExpr, LPSTR szFile, int iLine)
|
||
{
|
||
static char ach[300]; // debug output (avoid stack overflow)
|
||
int id;
|
||
int iExitCode;
|
||
void FAR PASCAL DebugBreak(void);
|
||
|
||
/* check if assertion failed */
|
||
if (fExpr)
|
||
return fExpr;
|
||
|
||
/* display error message */
|
||
wsprintf(ach, "File %s, line %d", (LPSTR) szFile, iLine);
|
||
MessageBeep(MB_ICONHAND);
|
||
id = MessageBox(NULL, ach, "Assertion Failed", MB_SYSTEMMODAL | MB_ICONHAND | MB_ABORTRETRYIGNORE);
|
||
|
||
/* abort, debug, or ignore */
|
||
switch (id)
|
||
{
|
||
|
||
case IDABORT:
|
||
|
||
/* kill this application */
|
||
iExitCode = 0;
|
||
#ifndef WIN32
|
||
_asm
|
||
{
|
||
mov ah, 4Ch
|
||
mov al, BYTE PTR iExitCode
|
||
int 21h
|
||
}
|
||
#endif // WIN16
|
||
break;
|
||
|
||
case IDRETRY:
|
||
|
||
/* break into the debugger */
|
||
DebugBreak();
|
||
break;
|
||
|
||
case IDIGNORE:
|
||
|
||
/* ignore the assertion failure */
|
||
break;
|
||
|
||
}
|
||
|
||
return FALSE;
|
||
}
|
||
#pragma optimize("", on)
|
||
|
||
#endif
|
||
|