287 lines
7.8 KiB
C
287 lines
7.8 KiB
C
//==========================================================================;
|
|
//
|
|
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
|
|
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
|
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
|
|
// PURPOSE.
|
|
//
|
|
// Copyright (c) 1992 - 1995 Microsoft Corporation. All Rights Reserved.
|
|
//
|
|
//--------------------------------------------------------------------------;
|
|
//
|
|
// codec.h
|
|
//
|
|
// Description:
|
|
// This file contains codec definitions, Win16/Win32 compatibility
|
|
// definitions, and instance structure definitions.
|
|
//
|
|
//
|
|
// History:
|
|
// 11/16/92 cjp [curtisp]
|
|
//
|
|
//==========================================================================;
|
|
|
|
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
|
|
//
|
|
// ACM Driver Version:
|
|
//
|
|
// the version is a 32 bit number that is broken into three parts as
|
|
// follows:
|
|
//
|
|
// bits 24 - 31: 8 bit _major_ version number
|
|
// bits 16 - 23: 8 bit _minor_ version number
|
|
// bits 0 - 15: 16 bit build number
|
|
//
|
|
// this is then displayed as follows (in decimal form):
|
|
//
|
|
// bMajor = (BYTE)(dwVersion >> 24)
|
|
// bMinor = (BYTE)(dwVersion >> 16) &
|
|
// wBuild = LOWORD(dwVersion)
|
|
//
|
|
// VERSION_CODEC is the version of this driver.
|
|
// VERSION_MSACM is the version of the ACM that this driver
|
|
// was designed for (requires).
|
|
//
|
|
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
|
|
|
|
#ifdef WIN32
|
|
//
|
|
// 32-bit versions
|
|
//
|
|
#if (WINVER >= 0x0400)
|
|
#define VERSION_CODEC MAKE_ACM_VERSION(4, 0, 0)
|
|
#else
|
|
#define VERSION_CODEC MAKE_ACM_VERSION(3, 51, 0)
|
|
#endif
|
|
#define VERSION_MSACM MAKE_ACM_VERSION(3, 50, 0)
|
|
|
|
#else
|
|
//
|
|
// 16-bit versions
|
|
//
|
|
#define VERSION_CODEC MAKE_ACM_VERSION(2, 1, 0)
|
|
#define VERSION_MSACM MAKE_ACM_VERSION(2, 1, 0)
|
|
|
|
#endif
|
|
|
|
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
|
|
//
|
|
// Win 16/32 portability stuff...
|
|
//
|
|
//
|
|
//
|
|
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
|
|
|
|
#ifndef WIN32
|
|
#ifndef FNLOCAL
|
|
#define FNLOCAL NEAR PASCAL
|
|
#define FNCLOCAL NEAR _cdecl
|
|
#define FNGLOBAL FAR PASCAL
|
|
#define FNCGLOBAL FAR _cdecl
|
|
#ifdef _WINDLL
|
|
#define FNWCALLBACK FAR PASCAL _loadds
|
|
#define FNEXPORT FAR PASCAL _export
|
|
#else
|
|
#define FNWCALLBACK FAR PASCAL
|
|
#define FNEXPORT FAR PASCAL _export
|
|
#endif
|
|
#endif
|
|
|
|
//
|
|
//
|
|
//
|
|
//
|
|
#ifndef FIELD_OFFSET
|
|
#define FIELD_OFFSET(type, field) ((LONG)&(((type *)0)->field))
|
|
#endif
|
|
|
|
//
|
|
// based code makes since only in win 16 (to try and keep stuff out of
|
|
// our fixed data segment...
|
|
//
|
|
#define BCODE _based(_segname("_CODE"))
|
|
|
|
#define HUGE _huge
|
|
|
|
//
|
|
// stuff for Unicode in Win 32--make it a noop in Win 16
|
|
//
|
|
#ifndef _TCHAR_DEFINED
|
|
#define _TCHAR_DEFINED
|
|
typedef char TCHAR, *PTCHAR;
|
|
typedef unsigned char TBYTE, *PTUCHAR;
|
|
|
|
typedef PSTR PTSTR, PTCH;
|
|
typedef LPSTR LPTSTR, LPTCH;
|
|
typedef LPCSTR LPCTSTR;
|
|
#endif
|
|
|
|
#define TEXT(a) a
|
|
#define SIZEOF(x) sizeof(x)
|
|
#define SIZEOFACMSTR(x) sizeof(x)
|
|
#else
|
|
#ifndef FNLOCAL
|
|
#define FNLOCAL _stdcall
|
|
#define FNCLOCAL _stdcall
|
|
#define FNGLOBAL _stdcall
|
|
#define FNCGLOBAL _stdcall
|
|
#define FNWCALLBACK CALLBACK
|
|
#define FNEXPORT CALLBACK
|
|
#endif
|
|
|
|
#ifndef _CRTAPI1
|
|
#define _CRTAPI1 __cdecl
|
|
#endif
|
|
#ifndef _CRTAPI2
|
|
#define _CRTAPI2 __cdecl
|
|
#endif
|
|
#ifndef try
|
|
#define try __try
|
|
#define leave __leave
|
|
#define except __except
|
|
#define finally __finally
|
|
#endif
|
|
|
|
|
|
//
|
|
// there is no reason to have based stuff in win 32
|
|
//
|
|
#define BCODE
|
|
|
|
#define HUGE
|
|
#define HTASK HANDLE
|
|
#define SELECTOROF(a) (a)
|
|
typedef LRESULT (CALLBACK* DRIVERPROC)(DWORD, HDRVR, UINT, LPARAM, LPARAM);
|
|
|
|
//
|
|
// for compiling Unicode
|
|
//
|
|
#ifdef UNICODE
|
|
#define SIZEOF(x) (sizeof(x)/sizeof(WCHAR))
|
|
#else
|
|
#define SIZEOF(x) sizeof(x)
|
|
#endif
|
|
#define SIZEOFACMSTR(x) (sizeof(x)/sizeof(WCHAR))
|
|
#endif
|
|
|
|
|
|
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
|
|
//
|
|
// misc defines for misc sizes and things...
|
|
//
|
|
//
|
|
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
|
|
|
|
//
|
|
// bilingual. this allows the same identifier to be used in resource files
|
|
// and code without having to decorate the id in your code.
|
|
//
|
|
#ifdef RC_INVOKED
|
|
#define RCID(id) id
|
|
#else
|
|
#define RCID(id) MAKEINTRESOURCE(id)
|
|
#endif
|
|
|
|
|
|
//
|
|
// macros to compute block alignment and convert between samples and bytes
|
|
// of PCM data. note that these macros assume:
|
|
//
|
|
// wBitsPerSample = 8 or 16
|
|
// nChannels = 1 or 2
|
|
//
|
|
// the pwf argument is a pointer to a WAVEFORMATEX structure.
|
|
//
|
|
#define PCM_BLOCKALIGNMENT(pwfx) (UINT)(((pwfx)->wBitsPerSample >> 3) << ((pwfx)->nChannels >> 1))
|
|
#define PCM_AVGBYTESPERSEC(pwfx) (DWORD)((pwfx)->nSamplesPerSec * (pwfx)->nBlockAlign)
|
|
#define PCM_BYTESTOSAMPLES(pwfx, cb) (DWORD)(cb / PCM_BLOCKALIGNMENT(pwfx))
|
|
#define PCM_SAMPLESTOBYTES(pwfx, dw) (DWORD)(dw * PCM_BLOCKALIGNMENT(pwfx))
|
|
|
|
|
|
//
|
|
//
|
|
//
|
|
#define MAX_ERR_STRING 250 // used in various places for errors
|
|
|
|
|
|
|
|
//
|
|
//
|
|
//
|
|
//
|
|
typedef struct tCODECINST
|
|
{
|
|
//
|
|
// although not required, it is suggested that the first two members
|
|
// of this structure remain as fccType and DriverProc _in this order_.
|
|
// the reason for this is that the codec will be easier to combine
|
|
// with other types of codecs (defined by AVI) in the future.
|
|
//
|
|
FOURCC fccType; // type of codec: 'audc'
|
|
DRIVERPROC DriverProc; // driver proc for the instance
|
|
|
|
//
|
|
// the remaining members of this structure are entirely open to what
|
|
// your codec requires.
|
|
//
|
|
HDRVR hdrvr; // driver handle we were opened with
|
|
HINSTANCE hinst; // DLL module handle.
|
|
DWORD vdwACM; // current version of ACM opening you
|
|
DWORD dwFlags; // flags from open description
|
|
|
|
} CODECINST, *PCODECINST, FAR *LPCODECINST;
|
|
|
|
|
|
|
|
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
|
|
//
|
|
// typedefs
|
|
//
|
|
//
|
|
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
|
|
|
|
//
|
|
// This define deals with unaligned data for Win32, and huge data for Win16.
|
|
// Basically, any time you cast an HPBYTE to a non-byte variable (ie long or
|
|
// short), you should cast it to ( {short,long} HUGE_T *). This will cast
|
|
// it to _huge for Win16, and make sure that there are no alignment problems
|
|
// for Win32 on MIPS and Alpha machines.
|
|
//
|
|
|
|
typedef BYTE HUGE *HPBYTE;
|
|
|
|
#ifdef WIN32
|
|
#define HUGE_T UNALIGNED
|
|
#else
|
|
#define HUGE_T _huge
|
|
#endif
|
|
|
|
|
|
typedef DWORD (FNGLOBAL *CONVERTPROC_ASM)(LPWAVEFORMATEX, LPBYTE, LPWAVEFORMATEX, LPBYTE, DWORD);
|
|
typedef DWORD (FNGLOBAL *CONVERTPROC_C)
|
|
(
|
|
HPBYTE pbSrc,
|
|
DWORD cbSrcLength,
|
|
HPBYTE pbDst,
|
|
UINT nBlockAlignment,
|
|
UINT cSamplesPerBlock,
|
|
UINT nNumCoef,
|
|
LPADPCMCOEFSET lpCoefSet
|
|
);
|
|
|
|
|
|
|
|
//
|
|
// resource id's
|
|
//
|
|
//
|
|
#define ICON_CODEC RCID(10)
|
|
|
|
#define IDS_CODEC_SHORTNAME (1) // ACMCONVINFO.szShortName
|
|
#define IDS_CODEC_LONGNAME (2) // ACMCONVINFO.szLongName
|
|
#define IDS_CODEC_COPYRIGHT (3) // ACMCONVINFO.szCopyright
|
|
#define IDS_CODEC_LICENSING (4) // ACMCONVINFO.szLicensing
|
|
#define IDS_CODEC_FEATURES (5) // ACMCONVINFO.szFeatures
|
|
|
|
#define IDS_CODEC_NAME (10)
|