|
|
//==========================================================================
//
// lhacm.h
//
// Copyright (c) 1992 - 1996 Microsoft Corporation. All Rights Reserved.
//
//==========================================================================
#ifndef _LHACM_H_
#define _LHACM_H_
#define _T(s) __TEXT (s)
#define TRACE_FUN
#ifdef DEBUG
#ifndef _DEBUG
#define _DEBUG
#endif
#endif
#ifdef _DEBUG
#include <assert.h>
#ifdef TRACE_FUN
#define FUNCTION_ENTRY(s) \
static TCHAR _szFunName_[] = _T ("LH::") _T (s); \ MyDbgPrintf (_T ("%s\r\n"), (LPTSTR) _szFunName_); #else
#define FUNCTION_ENTRY(s) \
static TCHAR _szFunName_[] = _T (s); #endif
#define SZFN ((LPTSTR) _szFunName_)
#define DBGMSG(z,s) ((z) ? (MyDbgPrintf s) : 0);
#else
#define FUNCTION_ENTRY(s)
#define SZFN
#define DBGMSG(z,s)
#endif
#define SIZEOFACMSTR(x) (sizeof(x)/sizeof(WCHAR))
void FAR CDECL MyDbgPrintf ( LPTSTR lpszFormat, ... );
//==========================================================================;
//
// Version info
//
//==========================================================================;
// !!! Need to assign a WAVE_FORMAT tag to the codec
#include "temp.h" // from common\h\temp.h
//Use CELP on _x86_ but not Alpha
#ifndef _ALPHA_
#define CELP4800
#endif
#define VERSION_ACM_DRIVER MAKE_ACM_VERSION(1, 0, 1)
#define VERSION_MSACM MAKE_ACM_VERSION(2, 1, 0)
// !!! Need to assign valid MID and PID
#define MM_ACM_MID_LH MM_MICROSOFT
#define MM_ACM_PID_LH 90
// !!! need to assign IDs
#define MM_LERNOUTHAUSPIE_ACM_CELP 0x70
#define MM_LERNOUTHAUSPIE_ACM_SB8 0x71
#define MM_LERNOUTHAUSPIE_ACM_SB12 0x72
#define MM_LERNOUTHAUSPIE_ACM_SB16 0x73
//==========================================================================;
//
// Helper routines
//
//==========================================================================;
#define SIZEOF_ARRAY(ar) (sizeof(ar)/sizeof((ar)[0]))
#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))
// !!! need defines for all four l&h codecs
#define LH_BITSPERSAMPLE 16
#define LH_SAMPLESPERSEC 8000
#define LH_PCM_SAMPLESPERSEC LH_SAMPLESPERSEC
#define LH_PCM_BITSPERSAMPLE LH_BITSPERSAMPLE
#ifdef CELP4800
#define LH_CELP_SAMPLESPERSEC LH_SAMPLESPERSEC
#define LH_CELP_BITSPERSAMPLE LH_BITSPERSAMPLE
#define LH_CELP_BLOCKALIGNMENT 2
#endif
#define LH_SB8_SAMPLESPERSEC LH_SAMPLESPERSEC
#define LH_SB8_BITSPERSAMPLE LH_BITSPERSAMPLE
#define LH_SB8_BLOCKALIGNMENT 2
#define LH_SB12_SAMPLESPERSEC LH_SAMPLESPERSEC
#define LH_SB12_BITSPERSAMPLE LH_BITSPERSAMPLE
#define LH_SB12_BLOCKALIGNMENT 2
#define LH_SB16_SAMPLESPERSEC LH_SAMPLESPERSEC
#define LH_SB16_BITSPERSAMPLE LH_BITSPERSAMPLE
#define LH_SB16_BLOCKALIGNMENT 2
// !!! l&h probably does not need an extended header...tbd
// lonchanc: we don't need an extended header
// because we will use separate wave format tags for
// different coding techniques.
//==========================================================================;
//
// Supported configurations
//
//==========================================================================;
#define LH_MAX_CHANNELS 1
//==========================================================================;
//
// Global storage and defs
//
//==========================================================================;
typedef HANDLE (LH_SUFFIX * PFN_OPEN) ( void ); typedef LH_ERRCODE (LH_SUFFIX * PFN_CONVERT) ( HANDLE, LPBYTE, LPWORD, LPBYTE, LPWORD ); typedef LH_ERRCODE (LH_SUFFIX * PFN_CLOSE) ( HANDLE );
typedef struct tagCODECDATA { DWORD wFormatTag; CODECINFO CodecInfo; } CODECDATA, *PCODECDATA;
typedef struct tagSTREAMINSTANCEDATA { BOOL fInit; // TRUE if this stream has been initialized
BOOL fCompress; // TRUE if we're compressing
HANDLE hAccess; PCODECDATA pCodecData; // shortcut to instance data's celp, sb8, sb12, or sb16.
PFN_CONVERT pfnConvert; // pointer to the encoder/decoder function
PFN_CLOSE pfnClose; // pointer to the close function
DWORD dwMaxBitRate; // bit rate of the codec
WORD cbData; // valid data
BYTE Data[2]; // max size is wCodedBufferSize
} STREAMINSTANCEDATA, FAR *PSTREAMINSTANCEDATA;
typedef struct tagINSTANCEDATA { WORD cbStruct; BOOL fInit; HINSTANCE hInst; CODECDATA CELP; CODECDATA SB8; CODECDATA SB12; CODECDATA SB16; WORD wPacketData;// packet by packet audio data (decoding only)
} INSTANCEDATA, *PINSTANCEDATA;
//==========================================================================;
//
// Function prototypes
//
//==========================================================================;
BOOL pcmIsValidFormat( LPWAVEFORMATEX pwfx ); BOOL lhacmIsValidFormat( LPWAVEFORMATEX pwfx, PINSTANCEDATA pid ); BOOL CALLBACK DlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); LRESULT FAR PASCAL acmdDriverOpen( HDRVR hdrvr, LPACMDRVOPENDESC paod ); LRESULT FAR PASCAL acmdDriverClose( PINSTANCEDATA pid ); LRESULT FAR PASCAL acmdDriverConfigure( PINSTANCEDATA pid, HWND hwnd, LPDRVCONFIGINFO pdci ); LRESULT FAR PASCAL acmdDriverDetails( PINSTANCEDATA pid, LPACMDRIVERDETAILS padd ); LRESULT FAR PASCAL acmdDriverAbout( PINSTANCEDATA pid, HWND hwnd ); LRESULT FAR PASCAL acmdFormatSuggest( PINSTANCEDATA pid, LPACMDRVFORMATSUGGEST padfs ); LRESULT FAR PASCAL acmdFormatTagDetails( PINSTANCEDATA pid, LPACMFORMATTAGDETAILS padft, DWORD fdwDetails ); LRESULT FAR PASCAL acmdFormatDetails( PINSTANCEDATA pid, LPACMFORMATDETAILS padf, DWORD fdwDetails ); LRESULT FAR PASCAL acmdStreamOpen( PINSTANCEDATA pid, LPACMDRVSTREAMINSTANCE padsi ); LRESULT FAR PASCAL acmdStreamClose( PINSTANCEDATA pid, LPACMDRVSTREAMINSTANCE padsi ); LRESULT FAR PASCAL acmdStreamSize( LPACMDRVSTREAMINSTANCE padsi, LPACMDRVSTREAMSIZE padss ); LRESULT FAR PASCAL acmdStreamConvert( PINSTANCEDATA pid, LPACMDRVSTREAMINSTANCE padsi, LPACMDRVSTREAMHEADER padsh ); LRESULT CALLBACK DriverProc(DWORD_PTR dwId, HDRVR hdrvr, UINT uMsg, LPARAM lParam1, LPARAM lParam2 );
#endif // _LHACM_H_
|