| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503 |
- /*
- ** 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/>.
- */
- /****************************************************************************
- *
- * 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
- * config.c
- *
- * DESCRIPTION
- * Player configuration routines.
- *
- * PROGRAMMER
- * Bill Randolph
- * Denzil E. Long, Jr.
- *
- * DATE
- * April 10, 1995
- *
- *----------------------------------------------------------------------------
- *
- * PUBLIC
- * VQA_INIConfig - Initialize VQAConfig structure with INI settings.
- * VQA_DefaultConfig - Initialize VQAConfig structure with defaults.
- *
- ****************************************************************************/
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include "vqaplayp.h"
- #include <vqm32\all.h>
- /*---------------------------------------------------------------------------
- * PRIVATE DECLARATIONS
- *-------------------------------------------------------------------------*/
- /* Default configuration structure. */
- static VQAConfig _defaultconfig = {
- /* DrawerCallback: This is a function that is called for every frame
- * in the movie.
- */
- NULL,
- /* EventHandler: This is a function that is called for every event that
- * the client requested to be notified about.
- */
- NULL,
- /* NotifyFlags: Flags representing the events the client wishes to be
- * notified about during playback.
- */
- NULL,
- /* Vmode: Video mode to use. */
- MCGA,
- /* VBIBit: Vertical blank bit polarity. */
- -1,
- /* ImageBuf: Pointer to image buffer to draw into. */
- NULL,
- /* ImageWidth, ImageHeight: Width and height dimensions of image buffer.
- * A width and height value of -1 tells the player to consider the image
- * buffer as having the same dimensions as the frames in the movie.
- */
- 320, 200, /* Image width and height */
- /* X1, Y1: These are the coordinates to put the movies frame in the image
- * buffer. Values of -1 tell the drawer to center the frames in the buffer.
- */
- -1, -1,
- /* FrameRate: The rate to load the frames at. A value of -1 tells the
- * player to use the framerate of the movie.
- */
- -1,
- /* DrawRate: The rate to draw the frames at. A value of -1 tells the
- * player to use the framerate of the movie. A value of 0 tells the player
- * to use a fixed rate based on the frame size.
- */
- -1,
- /* TimerMethod: Timer method to use for playback. */
- -1,
- /* DrawFlags: Various drawing related flags. */
- 0,
- /* OptionFlags: Various player options. */
- VQAOPTF_AUDIO,
- /* NumFrameBufs: The number of frame buffers to allocate/use. */
- 6,
- /* NumCBBufs: The number of codebook buffers to allocate/use. */
- 3,
- /* VocFile: Filename of audio track override. A value of 0 tells the
- * player not to override the movies audio track.
- */
- NULL,
- /* AudioBuf: Audio buffer to use. A value of 0 tells the player that
- * it has to allocate a buffer itself.
- */
- NULL,
- /* AudioBufSize: Size of audio buffer to use/allocate. A value of -1
- * tells the player to compute the buffer size from the audio
- * information in the movie.
- */
- -1,
- /* AudioRate: Audio playback rate in samples per second. A value of -1
- * tells the player to use the audio rate of the movie.
- */
- -1,
- /* Volume: Volume level to playback audio track. */
- 0x00FF,
- /* HMIBufSize: Size of HMIs internal buffer. */
- 2048L,
- /* DigiHandle: Handle to an initialized HMI sound driver. A value of -1
- * tells the player it must initialize the HMI sound driver itself.
- */
- -1,
- /* DigiCard: HMI ID of audio card to use. A value of 0 tells the player
- * not to use any card. A value of -1 tells the player to autodetect the
- * card in the system.
- */
- -1,
- /* DigiPort: Port address of the sound card. A value of -1 tells the player
- * to autodetect this address.
- */
- -1,
- /* DigiIRQ: Interrupt number of sound card. A value of -1 tells the player
- * to autodetect the interrupt used by the card.
- */
- -1,
- /* DigiDMA: DMA channel of the sound card. A value of -1 tells the player
- * to autodetect the channel used by the card.
- */
- -1,
- /* Language: Prefered language. */
- 0,
- /* CaptionFont: Caption text font. */
- NULL,
- /* EVAFont: EVA text font. */
- NULL,
- };
- /* Supported video modes. */
- #if(VQAVIDEO_ON)
- enum VMTAGS {
- VMTAG_NONE = 0,
- #if(VQAMCGA_ON)
- VMTAG_MCGA,
- VMTAG_MCGA_BUF,
- #endif
- #if(VQAXMODE_ON)
- VMTAG_XMODE320X200,
- VMTAG_XMODE320X200_BUF,
- VMTAG_XMODE320X200_VRAM,
- VMTAG_XMODE320X240,
- VMTAG_XMODE320X240_BUF,
- VMTAG_XMODE320X240_VRAM,
- #endif
- #if(VQAVESA_ON)
- VMTAG_VESA640X480_BUF,
- VMTAG_VESA640X480_X2,
- VMTAG_VESA320X200,
- VMTAG_VESA320X200_BUF,
- #endif
- };
- typedef struct _VideoModeTag {
- char const *token;
- long id;
- } VideoModeTag;
- VideoModeTag VideoModeTags[] = {
- {"NONE",VMTAG_NONE},
- #if(VQAMCGA_ON)
- {"MCGA", VMTAG_MCGA},
- {"MCGA_BUF",VMTAG_MCGA_BUF},
- #endif /* VQAMCGA_ON */
- #if(VQAXMODE_ON)
- {"XMODE_320X200", VMTAG_XMODE320X200},
- {"XMODE_320X200_BUF", VMTAG_XMODE320X200_BUF},
- {"XMODE_320X200_VRAM",VMTAG_XMODE320X200_VRAM},
- {"XMODE_320X240", VMTAG_XMODE320X240},
- {"XMODE_320X240_BUF", VMTAG_XMODE320X240_BUF},
- {"XMODE_320X240_VRAM",VMTAG_XMODE320X240_VRAM},
- #endif /* VQAXMODE_ON */
- #if(VQAVESA_ON)
- {"VESA_640X480_BUF",VMTAG_VESA640X480_BUF},
- {"VESA_640X480_X2", VMTAG_VESA640X480_X2},
- {"VESA_320X200", VMTAG_VESA320X200},
- {"VESA_320X200_BUF",VMTAG_VESA320X200_BUF},
- #endif /* VQAVESA_ON */
- {NULL, NULL}
- };
- #endif /* VQAVIDEO_ON */
- /****************************************************************************
- *
- * NAME
- * VQA_INIConfig - Initialize VQAConfig structure with INI settings.
- *
- * SYNOPSIS
- * VQA_INIConfig(Config)
- *
- * void VQA_INIConfig(VQAConfig *);
- *
- * FUNCTION
- * Initializes the configuration structure from the player INI file.
- *
- * INPUTS
- * Config - Pointer to VQAConfig structure.
- *
- * RESULT
- * NONE
- *
- ****************************************************************************/
- void VQA_INIConfig(VQAConfig *config)
- {
- char *ininame;
- char buf[80];
- long i;
- /* Set all Config entries to 0. */
- memset(config, 0, sizeof(VQAConfig));
- /* Retrieve player INI filename from an enviroment variable if
- * it is provided.
- */
- if ((ininame = getenv("VQACFG")) == NULL) {
- ininame = "PLAYER.INI";
- }
- /*-------------------------------------------------------------------------
- * VIDEO MODE AND DRAW FLAGS
- *-----------------------------------------------------------------------*/
- #if(VQAVIDEO_ON)
- /* Get video mode from INI */
- GetINIString("Player", "PlayerMode", "MCGA", buf, 80, ininame);
- /* Search supported modes for a match. */
- i = 0;
- while (VideoModeTags[i].token != NULL) {
- if (stricmp(buf, VideoModeTags[i].token) == 0) {
- break;
- }
- i++;
- }
- /* Setup for requested mode */
- switch (VideoModeTags[i].id) {
- /* MCGA direct */
- #if(VQAMONO_ON)
- case VMTAG_MCGA:
- config->Vmode = MCGA;
- break;
- /* MCGA buffered */
- case VMTAG_MCGA_BUF:
- config->Vmode = MCGA;
- config->DrawFlags |= VQACFGF_BUFFER;
- break;
- #endif /* VQAMCGA_ON */
- /* XMODE direct (320x200) */
- #if(VQAXMODE_ON)
- case VMTAG_XMODE320X200:
- config->Vmode = XMODE_320X200;
- break;
- /* XMODE buffered (320x200) */
- case VMTAG_XMODE320X200_BUF:
- config->Vmode = XMODE_320X200;
- config->DrawFlags |= VQACFGF_BUFFER;
- break;
- /* XMODE VRAM codebook (320x200) */
- case VMTAG_XMODE320X200_VRAM:
- config->Vmode = XMODE_320X200;
- config->DrawFlags |= VQACFGF_VRAMCB;
- break;
- /* XMODE direct (320x240) */
- case VMTAG_XMODE320X240:
- config->Vmode = XMODE_320X240;
- break;
- /* XMODE buffered (320x240) */
- case VMTAG_XMODE320X240_BUF:
- config->Vmode = XMODE_320X240;
- config->DrawFlags |= VQACFGF_BUFFER;
- break;
- /* XMODE VRAM codebook (320x240) */
- case VMTAG_XMODE320X240_VRAM:
- config->Vmode = XMODE_320X240;
- config->DrawFlags |= VQACFGF_VRAMCB;
- break;
- #endif /* VQAXMODE_ON */
- /* VESA buffered (640x480_256) */
- #if(VQAVESA_ON)
- case VMTAG_VESA640X480_BUF:
- config->Vmode = VESA_640X480_256;
- config->DrawFlags |= VQACFGF_BUFFER;
- break;
- /* VESA buffered scaled (640x480_256) */
- case VMTAG_VESA640X480_X2:
- config->Vmode = VESA_640X480_256;
- config->DrawFlags |= (VQACFGF_BUFFER|VQACFGF_SCALEX2);
- break;
- /* VESA direct (320x200_32k) */
- case VMTAG_VESA320X200:
- config->Vmode = VESA_320X200_32K_1;
- break;
- /* VESA buffered (320x200_32k) */
- case VMTAG_VESA320X200_BUF:
- config->Vmode = VESA_320X200_32K_1;
- config->DrawFlags |= VQACFGF_BUFFER;
- break;
- #endif /* VQAVESA_ON */
- /* Default to MCGA direct */
- VMTAG_NONE:
- default:
- config->Vmode = MCGA;
- break;
- }
- #endif /* VQAVIDEO_ON */
- /* Get framerate and drawrate. */
- GetINIString("Player", "FrameRate", "-1", buf, 80, ininame);
- config->FrameRate = atoi(buf);
- GetINIString("Player", "DrawRate", "Variable", buf, 80, ininame);
- if (!stricmp(buf, "Variable")) {
- config->DrawRate = -1;
- } else {
- config->DrawRate = 0;
- }
- /*-------------------------------------------------------------------------
- * AUDIO SETTINGS
- *-----------------------------------------------------------------------*/
- GetINIString("Player", "AudioRate", "-1", buf, 80, ininame);
- config->AudioRate = atoi(buf);
- /* OptionFlags */
- GetINIString("Player", "SoundEnabled", "True", buf, 80, ininame);
- if (!stricmp(buf, "True") || !stricmp(buf, "1")) {
- config->OptionFlags |= VQAOPTF_AUDIO;
- } else {
- config->OptionFlags &= (~VQAOPTF_AUDIO);
- }
- /* Default audio settings. */
- config->AudioBufSize = 32768U;
- config->HMIBufSize = 2048;
- config->DigiHandle = -1;
- config->Volume = 0x00FF;
- config->DigiCard = 0xFFFF;
- config->DigiPort = -1;
- config->DigiIRQ = -1;
- config->DigiDMA = -1;
- /* Configure sound hardware */
- GetINIString("Player", "Port", "-1", buf, 80, ininame);
- if (!stricmp(buf, "-1")) {
- config->DigiPort = -1;
- } else {
- sscanf(buf, "%x", &config->DigiPort);
- }
- GetINIString("Player", "IRQ", "-1", buf, 80, ininame);
- config->DigiIRQ = atoi(buf);
- GetINIString("Player", "DMA", "-1", buf, 80, ininame);
- config->DigiDMA = atoi(buf);
- /*-------------------------------------------------------------------------
- * GENERAL OPTIONS
- *-----------------------------------------------------------------------*/
- /* Enable/Disable single stepping */
- GetINIString("Player", "SingleStep", "False", buf, 80, ininame);
- if (!stricmp(buf, "True") || !stricmp(buf, "1")) {
- config->OptionFlags |= VQAOPTF_STEP;
- config->DrawFlags |= VQACFGF_NOSKIP;
- } else {
- config->OptionFlags &= (~VQAOPTF_STEP);
- }
- /* Enable/Disable Slowpalette */
- GetINIString("Player", "SlowPalette", "False", buf, 80, ininame);
- if (!stricmp(buf, "True") || !stricmp(buf, "1")) {
- config->OptionFlags |= VQAOPTF_SLOWPAL;
- } else {
- config->OptionFlags &= (~VQAOPTF_SLOWPAL);
- }
- /* Enable/Disable monochrome display */
- GetINIString("Player", "MonoOutput", "False", buf, 80, ininame);
- if (!stricmp(buf, "True") || !stricmp(buf, "1")) {
- config->OptionFlags |= VQAOPTF_MONO;
- } else {
- config->OptionFlags &= (~VQAOPTF_MONO);
- }
- /* Frame and codebook buffers */
- config->NumFrameBufs = 6;
- config->NumCBBufs = 3;
- }
- /****************************************************************************
- *
- * NAME
- * VQA_DefaultConfig - Initialize VQAConfig structure with defaults.
- *
- * SYNOPSIS
- * VQA_DefaultConfig(Config);
- *
- * void VQA_DefaultConfig(VQAConfig *);
- *
- * FUNCTION
- * Initialize configuration with default settings.
- *
- * INPUTS
- * Config - Pointer to VQA configuration structure.
- *
- * RESULT
- * NONE
- *
- ****************************************************************************/
- void VQA_DefaultConfig(VQAConfig *config)
- {
- memcpy(config, &_defaultconfig, sizeof(VQAConfig));
- }
|