windows-nt/Source/XPSP1/NT/multimedia/media/msacm/imaadpcm/codec.h

479 lines
12 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
//==========================================================================;
//
// 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-1998 Microsoft Corporation
//
//--------------------------------------------------------------------------;
//
// codec.h
//
// Description:
// This file contains codec definitions, Win16/Win32 compatibility
// definitions, and instance structure definitions.
//
//
//==========================================================================;
#ifndef _INC_CODEC
#define _INC_CODEC // #defined if codec.h has been included
#ifndef RC_INVOKED
#pragma pack(1) // assume byte packing throughout
#endif
#ifndef EXTERN_C
#ifdef __cplusplus
#define EXTERN_C extern "C"
#else
#define EXTERN_C extern
#endif
#endif
#ifdef __cplusplus
extern "C" // assume C declarations for C++
{
#endif
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
//
// 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_ACM_DRIVER 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_ACM_DRIVER MAKE_ACM_VERSION(4, 0, 0)
#else
#define VERSION_ACM_DRIVER MAKE_ACM_VERSION(3, 51, 0)
#endif
#define VERSION_MSACM MAKE_ACM_VERSION(3, 50, 0)
#else
//
// 16-bit versions
//
#define VERSION_ACM_DRIVER MAKE_ACM_VERSION(2, 3, 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 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_PTR, 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
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
//
// Compilation options:
//
// If IMAADPCM_USECONFIG is defined, then the codec will be compiled
// with a configuration dialog. If not, then the codec will not be
// configurable. It is expected that the configuration is only
// necessary for certain platforms...
//
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
#define IMAADPCM_USECONFIG
#ifdef IMAADPCM_USECONFIG
//
// See codec.c for a description of this structure and its use.
//
typedef struct tRATELISTFORMAT
{
UINT uFormatType;
UINT idsFormat;
DWORD dwMonoRate;
} RATELISTFORMAT;
typedef RATELISTFORMAT *PRATELISTFORMAT;
#define CONFIG_RLF_NONUMBER 1
#define CONFIG_RLF_MONOONLY 2
#define CONFIG_RLF_STEREOONLY 3
#define CONFIG_RLF_MONOSTEREO 4
#endif // IMAADPCM_USECONFIG
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
//
// 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
//
//
//
#define SIZEOF_ARRAY(ar) (sizeof(ar)/sizeof((ar)[0]))
//
//
//
typedef BOOL FAR* LPBOOL;
//
// 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 pwfx 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))
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
//
//
//
//
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
typedef struct tDRIVERINSTANCE
{
//
// 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 driver will be easier to combine
// with other types of drivers (defined by AVI) in the future.
//
FOURCC fccType; // type of driver: 'audc'
DRIVERPROC fnDriverProc; // driver proc for the instance
//
// the remaining members of this structure are entirely open to what
// your driver requires.
//
HDRVR hdrvr; // driver handle we were opened with
HINSTANCE hinst; // DLL module handle.
DWORD vdwACM; // current version of ACM opening you
DWORD fdwOpen; // flags from open description
DWORD fdwConfig; // stream instance configuration flags
#ifdef IMAADPCM_USECONFIG
LPDRVCONFIGINFO pdci;
HKEY hkey;
UINT nConfigMaxRTEncodeSetting;
UINT nConfigMaxRTDecodeSetting;
UINT nConfigPercentCPU;
BOOL fHelpRunning; // Used by config DlgProc only.
#ifdef WIN4
HBRUSH hbrDialog; // Used by config DlgProc only.
#endif
#endif
} DRIVERINSTANCE, *PDRIVERINSTANCE, FAR *LPDRIVERINSTANCE;
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
//
//
//
//
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
//
// 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 *STREAMCONVERTPROC)
(
HPBYTE pbSrc,
DWORD cbSrcLength,
HPBYTE pbDst,
UINT nBlockAlignment,
UINT cSamplesPerBlock,
int * pnStepIndexL,
int * pnStepIndexR
);
//
//
//
//
typedef struct tSTREAMINSTANCE
{
STREAMCONVERTPROC fnConvert; // stream instance conversion proc
DWORD fdwConfig; // stream instance configuration flags
int nStepIndexL; // Used to ensure that the step index
int nStepIndexR; // is maintained across converts. For
// mono signals, the index is stored in
// nStepIndexL.
} STREAMINSTANCE, *PSTREAMINSTANCE, FAR *LPSTREAMINSTANCE;
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
//
// resource id's
//
//
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
#define IDS_ACM_DRIVER_SHORTNAME (1) // ACMDRIVERDETAILS.szShortName
#define IDS_ACM_DRIVER_LONGNAME (2) // ACMDRIVERDETAILS.szLongName
#define IDS_ACM_DRIVER_COPYRIGHT (3) // ACMDRIVERDETAILS.szCopyright
#define IDS_ACM_DRIVER_LICENSING (4) // ACMDRIVERDETAILS.szLicensing
#define IDS_ACM_DRIVER_FEATURES (5) // ACMDRIVERDETAILS.szFeatures
#define IDS_ACM_DRIVER_TAG_NAME (20) // ACMFORMATTAGDETAILS.szFormatTag
#ifdef IMAADPCM_USECONFIG
//
// resource id's for the configuration dialog box
//
#define IDS_CONFIG_NORATES (30)
#define IDS_CONFIG_ALLRATES (31)
#define IDS_CONFIG_MONOONLY (32)
#define IDS_CONFIG_STEREOONLY (33)
#define IDS_CONFIG_MONOSTEREO (34)
#define IDS_ERROR (35)
#define IDS_ERROR_NOMEM (36)
#define IDD_CONFIG RCID(100)
#define IDC_BTN_AUTOCONFIG 1001
#define IDC_BTN_HELP 1002
#define IDC_COMBO_MAXRTENCODE 1003
#define IDC_COMBO_MAXRTDECODE 1004
#define IDC_STATIC_COMPRESS 1005
#define IDC_STATIC_DECOMPRESS 1006
#define IDC_STATIC -1
#endif
//
// global variables, etc...
//
#ifdef IMAADPCM_USECONFIG
extern const UINT gauFormatIndexToSampleRate[];
extern const UINT ACM_DRIVER_MAX_SAMPLE_RATES;
extern const UINT ACM_DRIVER_MAX_CHANNELS;
extern const RATELISTFORMAT gaRateListFormat[];
extern const UINT IMAADPCM_CONFIG_NUMSETTINGS;
#endif
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
//
// function prototypes
//
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
#ifdef IMAADPCM_USECONFIG
BOOL FNGLOBAL acmdDriverConfigInit
(
PDRIVERINSTANCE pdi,
LPCTSTR pszAliasName
);
INT_PTR FNWCALLBACK acmdDlgProcConfigure
(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
LRESULT FNLOCAL acmdFormatSuggest
(
PDRIVERINSTANCE pdi,
LPACMDRVFORMATSUGGEST padfs
);
LRESULT FNLOCAL acmdStreamSize
(
LPACMDRVSTREAMINSTANCE padsi,
LPACMDRVSTREAMSIZE padss
);
LRESULT FNLOCAL acmdStreamConvert
(
PDRIVERINSTANCE pdi,
LPACMDRVSTREAMINSTANCE padsi,
LPACMDRVSTREAMHEADER padsh
);
#endif
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
//
//
//
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
#ifndef RC_INVOKED
#pragma pack() // revert to default packing
#endif
#ifdef __cplusplus
} // end of extern "C" {
#endif
#endif // _INC_CODEC