/*
**	Command & Conquer Red Alert(tm)
**	Copyright 2025 Electronic Arts Inc.
**
**	This program is free software: you can redistribute it and/or modify
**	it under the terms of the GNU General Public License as published by
**	the Free Software Foundation, either version 3 of the License, or
**	(at your option) any later version.
**
**	This program is distributed in the hope that it will be useful,
**	but WITHOUT ANY WARRANTY; without even the implied warranty of
**	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
**	GNU General Public License for more details.
**
**	You should have received a copy of the GNU General Public License
**	along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef VQAPLAY_H
#define VQAPLAY_H
/****************************************************************************
*
*         C O N F I D E N T I A L -- W E S T W O O D  S T U D I O S
*
*----------------------------------------------------------------------------
*
* PROJECT
*     VQA player library. (32-Bit protected mode)
*
* FILE
*     vqaplay.h
*
* DESCRIPTION
*      VQAPlay library definitions.
*
* PROGRAMMER
*     Bill Randolph
*     Denzil E. Long, Jr.
*
* DATE
*     April 10, 1995
*
****************************************************************************/

/*---------------------------------------------------------------------------
 * CONDITIONAL COMPILATION FLAGS
 *-------------------------------------------------------------------------*/

// MEG - 11.28.95 - added for debug
extern void Debug_Printf( char *format_string, ... );

#ifdef __WATCOMC__
#define VQASTANDALONE 0  /* Stand alone player */
#define VQAVOC_ON     0  /* Enable VOC file override */
#define	VQAMONO_ON    0  /* Mono display output enable/disable */
#define VQADIRECT_SOUND 1       /* Use windows direct sound system */
#define VQAAUDIO_ON   1  /* Audio playback enable/disable */
#define VQAVIDEO_ON   0  /* Video manager enable/disable */
#define VQAMCGA_ON    1  /* MCGA enable/disable */
#define VQAXMODE_ON   0  /* Xmode enable/disable */
#define VQAVESA_ON    0  /* VESA enable/disable */
#define	VQABLOCK_2X2  0  /* 2x2 block decode enable/disable */
#define	VQABLOCK_2X3  0  /* 2x2 block decode enable/disable */
#define	VQABLOCK_4X2  1  /* 4x2 block decode enable/disable */
#define	VQABLOCK_4X4  0  /* 4x4 block decode enable/disable */
#define VQAWOOFER_ON  0
#else
#define VQASTANDALONE 0  /* Stand alone player */
#define VQAVOC_ON     0  /* Enable VOC file override */
#define	VQAMONO_ON    1  /* Mono display output enable/disable */
#define VQADIRECT_SOUND 1	/* Use windows direct sound system */
#define VQAAUDIO_ON   1  /* Audio playback enable/disable */
#define VQAVIDEO_ON   0  /* Video manager enable/disable */
#define VQAMCGA_ON    1  /* MCGA enable/disable */
#define VQAXMODE_ON   0  /* Xmode enable/disable */
#define VQAVESA_ON    0  /* VESA enable/disable */
#define	VQABLOCK_2X2  0  /* 2x2 block decode enable/disable */
#define	VQABLOCK_2X3  0  /* 2x2 block decode enable/disable */
#define	VQABLOCK_4X2  1  /* 4x2 block decode enable/disable */
#define	VQABLOCK_4X4  0  /* 4x4 block decode enable/disable */
#define VQAWOOFER_ON  0
#endif



#if (VQAAUDIO_ON && VQADIRECT_SOUND)
#define WIN32
#define _WIN32
#undef WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <windowsx.h>
#include "dsound.h"
#endif



/*---------------------------------------------------------------------------
 * GENERAL CONSTANT DEFINITIONS
 *-------------------------------------------------------------------------*/

/* Playback modes. */
#define VQAMODE_RUN   0  /* Run the movie through the end. */
#define VQAMODE_WALK  1  /* Draw the next frame then return. */
#define VQAMODE_PAUSE 2  /* Suspend movie playback. */
#define VQAMODE_STOP  3  /* Stop the movie. */

/* Playback timer methods */
#define VQA_TMETHOD_DEFAULT -1 /* Use default timer method. */
#define	VQA_TMETHOD_DOS      1 /* DOS timer method */
#define	VQA_TMETHOD_INT      2 /* Interrupt timer method */
#define	VQA_TMETHOD_AUDIO    3 /* Audio timer method */

#define	VQA_TIMETICKS 60 /* Clock ticks per second */

/* Error/Status conditions */
#define VQAERR_NONE      0  /* No error */
#define	VQAERR_EOF      -1  /* Valid end of file */
#define VQAERR_OPEN     -2  /* Unable to open */
#define	VQAERR_READ     -3  /* Read error */
#define VQAERR_WRITE    -4  /* Write error */
#define VQAERR_SEEK     -5  /* Seek error */
#define VQAERR_NOTVQA   -6  /* Not a valid VQA file. */
#define VQAERR_NOMEM    -7  /* Unable to allocate memory */
#define	VQAERR_NOBUFFER -8  /* No buffer avail for load/draw */
#define	VQAERR_NOT_TIME -9  /* Not time for frame yet */
#define	VQAERR_SLEEPING -10 /* Function is in a sleep state */
#define VQAERR_VIDEO    -11 /* Video related error. */
#define VQAERR_AUDIO    -12 /* Audio related error. */
#define VQAERR_PAUSED   -13 /* In paused state. */

/* Event flags. */
#define VQAEVENT_PALETTE (1<<0)
#define VQAEVENT_SYNC    (1<<1)


/*---------------------------------------------------------------------------
 * STRUCTURES AND RELATED DEFINITIONS
 *-------------------------------------------------------------------------*/

/* VQAConfig: Player configuration structure
 *
 * DrawerCallback - User routine for Drawer to call each frame (NULL = none)
 * EventHandler   - User routine for notification to client of events.
 * NotifyFlags    - User specified events to be notified about.
 * Vmode          - Requested Video mode (May be promoted).
 * VBIBit         - Vertical blank bit polarity.
 * ImageBuf       - Pointer to caller's buffer for the Drawer to use as its
 *                  ImageBuf; NULL = player will allocate its own, if
 *                  VQACFGF_BUFFER is set in DrawFlags.
 * ImageWidth     - Width of Image buffer.
 * ImageHeight    - Height of Image buffer.
 * X1             - Draw window X coordinate (-1 = Center).
 * Y1             - Draw window Y coordinate (-1 = Center).
 * FrameRate      - Desired frames per second (-1 = use VQA header's value).
 * DrawRate       - Desired drawing frame rate; allows the Drawer to draw at
 *                  a separate rate from the Loader.
 * TimerMethod    - Timer method to use during playback.
 * DrawFlags      - Bits control various special drawing options. (See below)
 * OptionFlags    - Bits control various special misc options. (See below)
 * NumFrameBufs   - Desired number of frame buffers. (Default = 6)
 * NumCBBufs      - Desired number of codebook buffers. (Default = 3)
 * SoundObject		- Ptr to callers Direct Sound Object (Default =NULL)
 * PrimaryBufferPtr- Ptr to callers Primary Sound Buffer. (Default = NULL)
 * VocFile        - Name of VOC file to play instead of VQA audio track.
 * AudioBuf       - Pointer to audio buffer.
 * AudioBufSize   - Size of audio buffer. (Default = 32768)
 * AudioRate      - Audio data playback rate (-1 = use samplerate scaled
 *                  to the frame rate)
 * Volume         - Audio playback volume. (0x7FFF = max)
 * HMIBufSize     - Desired HMI buffer size. (Default = 2000)
 * DigiHandle     - Handle to an initialized sound driver. (-1 = none)
 * DigiCard       - HMI ID of card to use. (0 = none, -1 = auto-detect)
 * DigiPort       - Audio port address. (-1 = auto-detect)
 * DigiIRQ        - Audio IRQ. (-1 = auto-detect)
 * DigiDMA        - Audio DMA channel. (-1 = auto-detect)
 * Language       - Language identifier. (Not used)
 * CapFont        - Pointer to font to use for subtitle text captions.
 * EVAFont        - Pointer to font to use for E.V.A text cations. (For C&C)
 */
typedef struct _VQAConfig {
	long          			(*DrawerCallback)(unsigned char *screen, long framenum);
	long          			(*EventHandler)(unsigned long event,void *buffer,long nbytes);
	unsigned long 			NotifyFlags;
	long          			Vmode;
	long          			VBIBit;
	unsigned char 			*ImageBuf;
	long          			ImageWidth;
	long          			ImageHeight;
	long          			X1,Y1;
	long          			FrameRate;
	long          			DrawRate;
	long          			TimerMethod;
	long          			DrawFlags;
	long          			OptionFlags;
	long          			NumFrameBufs;
	long          			NumCBBufs;
#if (VQADIRECT_SOUND)
	LPDIRECTSOUND			SoundObject;
	LPDIRECTSOUNDBUFFER	PrimaryBufferPtr;
#endif	//(VQADIRECT_SOUND)
	char          			*VocFile;
	unsigned char 			*AudioBuf;
	long          			AudioBufSize;
	long          			AudioRate;
	long          			Volume;
	long          			HMIBufSize;
	long          			DigiHandle;
	long          			DigiCard;
	long          			DigiPort;
	long          			DigiIRQ;
	long          			DigiDMA;
	long          			Language;
	char          			*CapFont;
	char          			*EVAFont; /* For C&C Only */
} VQAConfig;

/* Drawer Configuration flags (DrawFlags) */
#define	VQACFGB_BUFFER   0 /* Buffer UnVQ enable */
#define	VQACFGB_NODRAW   1 /* Drawing disable */
#define VQACFGB_NOSKIP   2 /* Disable frame skipping. */
#define	VQACFGB_VRAMCB   3 /* XMode VRAM copy enable */
#define VQACFGB_ORIGIN   4 /* 0,0 origin position */
#define	VQACFGB_SCALEX2  6 /* Scale X2 enable (VESA 320x200 to 640x400) */
#define VQACFGB_WOOFER   7
#define	VQACFGF_BUFFER   (1<<VQACFGB_BUFFER)
#define	VQACFGF_NODRAW   (1<<VQACFGB_NODRAW)
#define	VQACFGF_NOSKIP   (1<<VQACFGB_NOSKIP)
#define	VQACFGF_VRAMCB   (1<<VQACFGB_VRAMCB)
#define	VQACFGF_ORIGIN   (3<<VQACFGB_ORIGIN)
#define	VQACFGF_TOPLEFT  (0<<VQACFGB_ORIGIN)
#define	VQACFGF_TOPRIGHT (1<<VQACFGB_ORIGIN)
#define	VQACFGF_BOTRIGHT (2<<VQACFGB_ORIGIN)
#define	VQACFGF_BOTLEFT  (3<<VQACFGB_ORIGIN)
#define	VQACFGF_SCALEX2  (1<<VQACFGB_SCALEX2)
#define VQACFGF_WOOFER   (1<<VQACFGB_WOOFER)

/* Options Configuration (OptionFlags) */
#define	VQAOPTB_AUDIO    0 /* Audio enable. */
#define	VQAOPTB_STEP     1 /* Single step enable. */
#define	VQAOPTB_MONO     2 /* Mono output enable. */
#define VQAOPTB_PALOFF   3 /* Palette set disable. */
#define	VQAOPTB_SLOWPAL  4 /* Slow palette enable. */
#define VQAOPTB_HMIINIT  5 /* HMI already initialized by client. */
#define VQAOPTB_ALTAUDIO 6 /* Use alternate audio track. */
#define VQAOPTB_CAPTIONS 7 /* Show captions. */
#define VQAOPTB_EVA      8 /* Show EVA text (For C&C only) */
#define	VQAOPTF_AUDIO    (1<<VQAOPTB_AUDIO)
#define	VQAOPTF_STEP     (1<<VQAOPTB_STEP)
#define	VQAOPTF_MONO     (1<<VQAOPTB_MONO)
#define VQAOPTF_PALOFF   (1<<VQAOPTB_PALOFF)
#define	VQAOPTF_SLOWPAL  (1<<VQAOPTB_SLOWPAL)
#define VQAOPTF_HMIINIT  (1<<VQAOPTB_HMIINIT)
#define	VQAOPTF_ALTAUDIO (1<<VQAOPTB_ALTAUDIO)
#define VQAOPTF_CAPTIONS (1<<VQAOPTB_CAPTIONS)
#define VQAOPTF_EVA      (1<<VQAOPTB_EVA) /* For C&C only */


/* VQAInfo: Information about the VQA movie.
 *
 * NumFrames   - The number of frames contained in the movie.
 * ImageHeight - Height of image in pixels.
 * ImageWidth  - Width of image in pixels.
 * ImageBuf    - Pointer to the image buffer VQA draw into.
 */
typedef struct _VQAInfo {
	long NumFrames;
	long ImageWidth;
	long ImageHeight;
	unsigned char *ImageBuf;
} VQAInfo;


/* VQAStatistics: Statistics about the VQA movie played.
 *
 * StartTime     - Time movie started.
 * EndTime       - Time movie stoped.
 * FramesLoaded  - Total number of frames loaded.
 * FramesDrawn   - Total number of frames drawn.
 * FramesSkipped - Total number of frames skipped.
 * MaxFrameSize  - Size of largest frame.
 * SamplesPlayed - Number of sample bytes played.
 * MemUsed       - Total bytes used. (Low memory)
 */
typedef struct _VQAStatistics {
	long          StartTime;
	long          EndTime;
	long          FramesLoaded;
	long          FramesDrawn;
	long          FramesSkipped;
	long          MaxFrameSize;
	unsigned long SamplesPlayed;
	unsigned long MemUsed;
} VQAStatistics;


/* VQAHandle: VQA file handle. (Must be obtained by calling VQA_Alloc()
 *            and freed through VQA_Free(). This is the only legal way
 *            to obtain and dispose of a VQAHandle.
 *
 * VQAio - Something meaningful to the IO manager. (See DOCS)
 */
typedef struct _VQAHandle {
	unsigned long VQAio;
} VQAHandle;

/* Possible IO command values */
#define VQACMD_INIT    1 /* Prepare the IO for a session */
#define VQACMD_CLEANUP 2 /* Terminate IO session */
#define VQACMD_OPEN    3 /* Open file */
#define VQACMD_CLOSE   4 /* Close file */
#define VQACMD_READ    5 /* Read bytes */
#define VQACMD_WRITE   6 /* Write bytes */
#define VQACMD_SEEK    7 /* Seek */


/*---------------------------------------------------------------------------
 * FUNCTION PROTOTYPES
 *-------------------------------------------------------------------------*/

/* Configuration routines. */
void VQA_INIConfig(VQAConfig *config);
void VQA_DefaultConfig(VQAConfig *config);

/* Handle manipulation routines. */
VQAHandle *VQA_Alloc(void);
void VQA_Free(VQAHandle *vqa);
void VQA_Reset(VQAHandle *vqa);
void VQA_InitAsDOS(VQAHandle *vqa);
void VQA_Init(VQAHandle *vqa, long(*iohandler)(VQAHandle *vqa, long action,
		void *buffer, long nbytes));
unsigned char *VQA_GetPalette(VQAHandle *vqa);
long VQA_GetPaletteSize(VQAHandle *vqa);
void VQA_Set_DrawBuffer(VQAHandle *vqa, unsigned char *buffer,
		unsigned long width, unsigned long height,
		long xpos, long ypos);

/* File routines. */
long VQA_Open(VQAHandle *vqa, char const *filename, VQAConfig *config);
void VQA_Close(VQAHandle *vqa);
long VQA_Play(VQAHandle *vqa, long mode);
long VQA_SeekFrame(VQAHandle *vqa, long frame, long fromwhere);
long VQA_SetStop(VQAHandle *vqa, long stop);
void VQA_PauseAudio(void);
void VQA_ResumeAudio(void);

/* Information/statistics access routines. */
void VQA_GetInfo(VQAHandle *vqa, VQAInfo *info);
void VQA_GetStats(VQAHandle *vqa, VQAStatistics *stats);
char *VQA_Version(void);
char *VQA_IDString(void);

#endif /* VQAPLAY_H */

