562 lines
15 KiB
C
562 lines
15 KiB
C
//
|
|
// Copyright 2020 Electronic Arts Inc.
|
|
//
|
|
// TiberianDawn.DLL and RedAlert.dll and corresponding source code 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.
|
|
|
|
// TiberianDawn.DLL and RedAlert.dll and corresponding source code is distributed
|
|
// in the hope that it will be useful, but with permitted additional restrictions
|
|
// under Section 7 of the GPL. See the GNU General Public License in LICENSE.TXT
|
|
// distributed with this program. You should have received a copy of the
|
|
// GNU General Public License along with permitted additional restrictions
|
|
// with this program. If not, see https://github.com/electronicarts/CnC_Remastered_Collection
|
|
|
|
/****************************************************************************
|
|
|
|
File : sos.h
|
|
|
|
Programmer(s) : Don Fowler, Nick Skrepetos
|
|
Date :
|
|
|
|
Purpose : Include Files For Zortech C++ Compiler
|
|
|
|
Last Updated :
|
|
|
|
****************************************************************************
|
|
Copyright(c) 1993,1994 Human Machine Interfaces
|
|
All Rights Reserved
|
|
****************************************************************************/
|
|
|
|
#ifndef _SOS_DEFINED
|
|
#define _SOS_DEFINED
|
|
#include "sosdefs.h"
|
|
|
|
#pragma pack(4)
|
|
|
|
// error definition for sound operating system
|
|
#define _SOS_ERR -1
|
|
|
|
// number of drivers allowed to be open at one time
|
|
#define _SOS_MAX_DRIVERS 5
|
|
|
|
// structure definition for the capabilities
|
|
typedef struct _tagCAPABILITIES
|
|
{
|
|
BYTE szDeviceName[ 32 ]; // device name
|
|
WORD wDeviceVersion; // device version
|
|
WORD wBitsPerSample; // bits per sound sample
|
|
WORD wChannels; // stereo/mono sound card
|
|
WORD wMinRate; // minimum rate
|
|
WORD wMaxRate; // maximum rate
|
|
WORD wMixerOnBoard; // board contains mixer
|
|
WORD wMixerFlags; // mixer capabilities
|
|
WORD wFlags; // miscellaneous flags
|
|
short far * lpPortList; // list of usable ports
|
|
short far * lpDMAList; // list of usable dma channels
|
|
short far * lpIRQList; // list of usable irq channels
|
|
short far * lpRateList; // list of usable rates, -1 if any in min to max
|
|
WORD fBackground; // foreground or background driver
|
|
WORD wDeviceID; // ID for the device
|
|
WORD wTimerID; // ID for the timer
|
|
|
|
} _SOS_CAPABILITIES;
|
|
|
|
// far pointer to the device capabilities structure
|
|
typedef _SOS_CAPABILITIES far * LPSOSDEVICECAPS;
|
|
|
|
// flag types for driver
|
|
#define _FLAGS_SIGNED 0x8000
|
|
|
|
// devices that can be loaded
|
|
#define _SOUND_BLASTER_8_MONO 0xe000
|
|
#define _SOUND_BLASTER_8_ST 0xe001
|
|
#define _SBPRO_8_ST _SOUND_BLASTER_8_ST
|
|
#define _SBPRO_8_MONO 0xe00f
|
|
#define _SOUND_MASTER_II_8_MONO 0xe002
|
|
#define _MV_PAS_8_MONO 0xe003
|
|
#define _MV_PAS_16_MONO 0xe004
|
|
#define _MV_PAS_8_ST 0xe005
|
|
#define _MV_PAS_16_ST 0xe006
|
|
#define _ADLIB_GOLD_8_ST 0xe007
|
|
#define _ADLIB_GOLD_16_ST 0xe008
|
|
#define _ADLIB_GOLD_8_MONO 0xe009
|
|
#define _ADLIB_GOLD_16_MONO 0xe00a
|
|
#define _MICROSOFT_8_MONO 0xe00b
|
|
#define _MICROSOFT_8_ST 0xe00c
|
|
#define _MICROSOFT_16_MONO 0xe00d
|
|
#define _MICROSOFT_16_ST 0xe00e
|
|
#define _SOUND_SOURCE_8_MONO_PC 0xe010
|
|
#define _SOUND_SOURCE_8_MONO_TANDY 0xe011
|
|
#define _GENERAL_PORT_8_MONO 0xe012
|
|
#define _GENERAL_PORT_8_MONO_R 0xe013
|
|
#define _SIERRA_8_MONO 0xe014
|
|
#define _SB16_8_MONO 0xe015
|
|
#define _SB16_8_ST 0xe016
|
|
#define _SB16_16_MONO 0xe017
|
|
#define _SB16_16_ST 0xe018
|
|
#define _ESS_AUDIODRIVE_8_MONO 0xe019
|
|
#define _ESS_AUDIODRIVE_8_ST 0xe01a
|
|
#define _ESS_AUDIODRIVE_16_MONO 0xe01b
|
|
#define _ESS_AUDIODRIVE_16_ST 0xe01c
|
|
#define _SOUNDSCAPE_8_MONO 0xe01d
|
|
#define _SOUNDSCAPE_8_ST 0xe01e
|
|
#define _SOUNDSCAPE_16_MONO 0xe01f
|
|
#define _SOUNDSCAPE_16_ST 0xe020
|
|
#define _RAP10_8_MONO 0xe021
|
|
#define _RAP10_16_MONO 0xe022
|
|
#define _GUS_8_MONO 0xe023
|
|
#define _GUS_8_ST 0xe024
|
|
#define _GUS_16_MONO 0xe025
|
|
#define _GUS_16_ST 0xe026
|
|
#define _GUS_MAX_8_MONO 0xe027
|
|
#define _GUS_MAX_8_ST 0xe028
|
|
#define _GUS_MAX_16_MONO 0xe029
|
|
#define _GUS_MAX_16_ST 0xe02a
|
|
#define _WAVEJAMMER_8_MONO 0xe02b
|
|
#define _WAVEJAMMER_8_ST 0xe02c
|
|
#define _WAVEJAMMER_16_MONO 0xe02d
|
|
#define _WAVEJAMMER_16_ST 0xe02e
|
|
#define _TEMPOCS_8_MONO 0xe02f
|
|
#define _TEMPOCS_8_ST 0xe030
|
|
#define _TEMPOCS_16_MONO 0xe031
|
|
#define _TEMPOCS_16_ST 0xe032
|
|
#define _WAVEJAMMERCD_8_MONO 0xe033
|
|
#define _WAVEJAMMERCD_8_ST 0xe034
|
|
#define _WAVEJAMMERCD_16_MONO 0xe035
|
|
#define _WAVEJAMMERCD_16_ST 0xe036
|
|
#define _SOUND_BLASTER_8_MONO_R 0xe050
|
|
#define _MICROSOFT_8_MONO_R 0xe051
|
|
#define _SOUND_MASTER_II_8_MONO_R 0xe052
|
|
#define _ADLIB_GOLD_8_MONO_R 0xe053
|
|
#define _MV_PAS_8_MONO_R 0xe054
|
|
#define _RAP10_8_MONO_R 0xe058
|
|
#define _RAP10_16_MONO_R 0xe059
|
|
#define _SB16_8_MONO_R 0xe05a
|
|
#define _SB16_8_ST_R 0xe05b
|
|
#define _SB16_16_MONO_R 0xe05c
|
|
#define _SB16_16_ST_R 0xe05d
|
|
#define _MV_PAS_16_MONO_R 0xe060
|
|
#define _SOUNDSCAPE_8_MONO_R 0xe061
|
|
#define _SOUNDSCAPE_8_ST_R 0xe062
|
|
#define _SOUNDSCAPE_16_MONO_R 0xe063
|
|
#define _SOUNDSCAPE_16_ST_R 0xe064
|
|
#define _ESS_AUDIODRIVE_8_MONO_R 0xe065
|
|
#define _ESS_AUDIODRIVE_8_ST_R 0xe066
|
|
#define _ESS_AUDIODRIVE_16_MONO_R 0xe067
|
|
#define _ESS_AUDIODRIVE_16_ST_R 0xe068
|
|
#define _SPEECH_THING_8_MONO 0xe090
|
|
#define _YAMAHA_8_MONO 0xe106
|
|
#define _INT_SPEAKER_8_MONO 0xe107
|
|
|
|
// call indexes for the loadable drivers
|
|
enum
|
|
{
|
|
_DRV_INIT,
|
|
_DRV_UNINIT,
|
|
_DRV_SETRATE,
|
|
_DRV_SETACTION,
|
|
_DRV_START,
|
|
_DRV_STOP,
|
|
_DRV_PAUSE,
|
|
_DRV_RESUME,
|
|
_DRV_CAPABILITIES,
|
|
_DRV_PLAY_FOREGROUND,
|
|
_DRV_GET_FILL_INFO,
|
|
_DRV_GET_CALL_FUNCTIONS,
|
|
_DRV_SET_CALL_FUNCTIONS
|
|
};
|
|
|
|
// fill info
|
|
typedef struct _tagFillInfo
|
|
{
|
|
|
|
LPSTR lpFillHandler; // pointer to fill handler
|
|
LPWORD lpDMAFillCount; // pointer to dma count
|
|
LPSTR lpSampleList; // pointer to sample list
|
|
LPWORD lpDMAMasterVolume; // pointer to dma count
|
|
|
|
} _SOS_FILL_INFO;
|
|
|
|
// caps info structure
|
|
typedef struct _tagCapsInfo
|
|
{
|
|
|
|
LPSTR lpPortList; // pointer to port list
|
|
LPSTR lpDMAList; // pointer to DMA list
|
|
LPSTR lpIRQList; // pointer to IRQ list
|
|
LPSTR lpRateList; // pointer to rate list
|
|
|
|
} _SOS_CAPS_INFO;
|
|
|
|
// maximum number of available voice
|
|
#define _MAX_VOICES 32
|
|
|
|
// structure definition
|
|
typedef struct _tagSAMPLE
|
|
{
|
|
LPSTR samplePtr; // pointer to data buffer
|
|
LPSTR sampleData; // pointer to active data
|
|
LPSTR sampleLoopPtr; // pointer for loop back
|
|
|
|
WORD sampleLength; // length of sample
|
|
WORD sampleIndex; // index into sample
|
|
WORD sampleLoopLength; // length of loop
|
|
|
|
WORD sampleBytesLeft; // bytes left to play in sample
|
|
|
|
WORD sampleLoopPoint; // byte count for loop point
|
|
WORD sampleLoopEndLength; // length of remaining chunk
|
|
|
|
short sampleFlags; // control sample
|
|
short sampleVolume; // volume control
|
|
short sampleID; // sample ID
|
|
|
|
short sampleChannel; // channel to play sample on
|
|
short sampleLoopCount; // loop count
|
|
short sampleLastFill; // last fill position
|
|
VOID ( far __cdecl * sampleCallback )( WORD, WORD, WORD ); // callback function for sample
|
|
|
|
WORD samplePitchAdd;
|
|
short samplePitchFraction;
|
|
|
|
short samplePort; // port to use for non-dma digitized
|
|
|
|
WORD sampleTotalBytes;
|
|
WORD sampleByteLength;
|
|
|
|
short samplePanLocation;
|
|
short samplePanSpeed;
|
|
short samplePanDirection;
|
|
short samplePanStart;
|
|
short samplePanEnd;
|
|
|
|
short sampleDelayBytes;
|
|
short sampleDelayRepeat;
|
|
|
|
WORD sampleADPCMPredicted;
|
|
short sampleADPCMIndex;
|
|
|
|
short sampleRootNoteMIDI;
|
|
|
|
WORD sampleTemp1;
|
|
|
|
} _SOS_SAMPLE;
|
|
|
|
// enumeration for left or right channel
|
|
enum
|
|
{
|
|
_LEFT_CHANNEL,
|
|
_RIGHT_CHANNEL,
|
|
_CENTER_CHANNEL,
|
|
_INTERLEAVED
|
|
};
|
|
|
|
// enumeration for foreground and background
|
|
enum
|
|
{
|
|
_FOREGROUND,
|
|
_BACKGROUND
|
|
};
|
|
|
|
// defines for the sample flags
|
|
#define _ACTIVE 0x8000
|
|
#define _LOOPING 0x4000
|
|
#define _FIRST_TIME 0x2000
|
|
#define _PENDING_RELEASE 0x1000
|
|
#define _CONTINUE_BLOCK 0x0800
|
|
#define _PITCH_SHIFT 0x0400
|
|
#define _PANNING 0x0200
|
|
#define _VOLUME 0x0100
|
|
#define _TRANSLATE16TO8 0x0080
|
|
#define _STAGE_LOOP 0x0040
|
|
#define _TRANSLATE8TO16 0x0020
|
|
#define _STEREOTOMONO 0x0010
|
|
|
|
// defines for the wParam flags
|
|
#define _SINGLE_SAMPLE 0x01
|
|
|
|
#define _SOS_DCAPS_AUTO_REINIT 0x01
|
|
#define _SOS_DCAPS_MPU_401 0x02
|
|
#define _SOS_DCAPS_OPL2 0x04
|
|
#define _SOS_DCAPS_OPL3 0x08
|
|
#define _SOS_DCAPS_OPL4 0x10
|
|
#define _SOS_DCAPS_WAVETABLE 0x20
|
|
#define _SOS_DCAPS_DL_SAMPLES 0x40
|
|
#define _SOS_DCAPS_FIFO_DEVICE 0x80
|
|
#define _SOS_DCAPS_ENV_NEEDED 0x100
|
|
#define _SOS_DCAPS_PSEUDO_DMA1 0x200
|
|
#define _SOS_DCAPS_SIGNED_DATA 0x8000
|
|
|
|
// file header structure
|
|
typedef struct
|
|
{
|
|
// name ID
|
|
BYTE szName[ 32 ];
|
|
|
|
// number of drivers in the file
|
|
WORD wDrivers;
|
|
|
|
// offset of first driver
|
|
WORD lOffset;
|
|
|
|
// size of the file
|
|
WORD lFileSize;
|
|
|
|
} _FILEHEADER;
|
|
|
|
// driver header structure
|
|
typedef struct
|
|
{
|
|
// name ID
|
|
BYTE szName[ 32 ];
|
|
|
|
// offset of next driver
|
|
WORD lNextDriver;
|
|
|
|
// size of current driver
|
|
WORD wSize;
|
|
|
|
// id for the current device
|
|
WORD wDeviceID;
|
|
|
|
// id for the type of DOS extender
|
|
WORD wExtenderType;
|
|
|
|
} _DRIVERHEADER;
|
|
|
|
// device hardware information
|
|
typedef struct
|
|
{
|
|
// port to be used
|
|
WORD wPort;
|
|
|
|
// irq to use
|
|
WORD wIRQ;
|
|
|
|
// dma channel to se
|
|
WORD wDMA;
|
|
|
|
// extra parameter
|
|
WORD wParam;
|
|
|
|
} _SOS_HARDWARE;
|
|
|
|
// structure definition for start sample
|
|
typedef struct
|
|
{
|
|
// pointer to sample
|
|
LPSTR lpSamplePtr;
|
|
|
|
// size of the sample
|
|
WORD dwSampleSize;
|
|
|
|
// number of times to loop the sample -1 is infinite
|
|
WORD wLoopCount;
|
|
|
|
// channel to play sample on
|
|
WORD wChannel;
|
|
|
|
// volume to play sample at
|
|
WORD wVolume;
|
|
|
|
// id for the sample
|
|
WORD wSampleID;
|
|
|
|
// far pointer to the callback function
|
|
VOID ( far __cdecl *lpCallback )( WORD, WORD, WORD );
|
|
|
|
// port to use if driver is a non-dma background driver
|
|
WORD wSamplePort;
|
|
|
|
// flags field
|
|
WORD wSampleFlags;
|
|
|
|
// total length of sample including loops, etc..
|
|
WORD dwSampleByteLength;
|
|
|
|
// loop point for the sample
|
|
WORD dwSampleLoopPoint;
|
|
WORD dwSampleLoopLength;
|
|
|
|
// pitch shifting components
|
|
WORD dwSamplePitchAdd;
|
|
WORD wSamplePitchFraction;
|
|
|
|
// pan components
|
|
WORD wSamplePanLocation;
|
|
WORD wSamplePanSpeed;
|
|
WORD wSamplePanDirection;
|
|
WORD wSamplePanStart;
|
|
WORD wSamplePanEnd;
|
|
|
|
// delay parts
|
|
WORD wSampleDelayBytes;
|
|
WORD wSampleDelayRepeat;
|
|
|
|
// compression components
|
|
WORD dwSampleADPCMPredicted;
|
|
WORD wSampleADPCMIndex;
|
|
|
|
// root note for pitch shifting
|
|
WORD wSampleRootNoteMIDI;
|
|
|
|
// filler for future upgrades
|
|
WORD dwSampleTemp1;
|
|
WORD dwSampleTemp2;
|
|
WORD dwSampleTemp3;
|
|
|
|
} _SOS_START_SAMPLE;
|
|
|
|
// structure for initializing a driver
|
|
typedef struct
|
|
{
|
|
WORD wBufferSize;
|
|
LPSTR lpBuffer;
|
|
BOOL wAllocateBuffer;
|
|
WORD wSampleRate;
|
|
WORD wParam;
|
|
LONG dwParam;
|
|
VOID ( far *lpFillHandler )( VOID );
|
|
LPSTR lpDriverMemory;
|
|
LPSTR lpDriverMemoryCS;
|
|
LPSTR lpTimerMemory;
|
|
LPSTR lpTimerMemoryCS;
|
|
WORD wTimerID;
|
|
WORD wPhysical;
|
|
|
|
} _SOS_INIT_DRIVER;
|
|
|
|
// define for the timer types to use
|
|
#define _SOS_NORMAL_TIMER 0x00
|
|
|
|
// enumeration for the timer types
|
|
enum
|
|
{
|
|
_TIMER_8_MONO = 0x1000,
|
|
_TIMER_8_ST,
|
|
_TIMER_16_MONO,
|
|
_TIMER_16_ST,
|
|
_TIMER_8_MONO_ULAW,
|
|
_TIMER_8_ST_ULAW,
|
|
_TIMER_16_MONO_ULAW,
|
|
_TIMER_16_ST_ULAW,
|
|
_TIMER_8_MONO_REC,
|
|
_TIMER_8_MONO_ULAW_REC,
|
|
_TIMER_UNDEFINED_1,
|
|
_TIMER_UNDEFINED_2,
|
|
_TIMER_UNDEFINED_3,
|
|
_TIMER_UNDEFINED_4,
|
|
_TIMER_UNDEFINED_5,
|
|
_TIMER_UNDEFINED_6,
|
|
_TIMER_UNDEFINED_7,
|
|
_TIMER_UNDEFINED_8,
|
|
_TIMER_UNDEFINED_9,
|
|
_TIMER_UNDEFINED_A,
|
|
_TIMER_UNDEFINED_B,
|
|
_TIMER_UNDEFINED_C,
|
|
_TIMER_UNDEFINED_D,
|
|
_TIMER_UNDEFINED_E,
|
|
_TIMER_UNDEFINED_F,
|
|
_TIMER_UNDEFINED_10,
|
|
_TIMER_UNDEFINED_11,
|
|
_TIMER_UNDEFINED_12,
|
|
_TIMER_UNDEFINED_13,
|
|
_TIMER_UNDEFINED_14,
|
|
_TIMER_UNDEFINED_15,
|
|
_TIMER_UNDEFINED_16,
|
|
_TIMER_8_SOUND_SOURCE,
|
|
_TIMER_8_SOUND_SOURCE_TANDY,
|
|
_TIMER_8_GENERAL_PORT,
|
|
_TIMER_8_GENERAL_PORT_REC
|
|
};
|
|
|
|
// define for no slots available
|
|
#define _ERR_NO_SLOTS ( WORD )-1
|
|
|
|
// error codes for the system
|
|
enum
|
|
{
|
|
_ERR_NO_ERROR,
|
|
_ERR_DRIVER_NOT_LOADED,
|
|
_ERR_INVALID_POINTER,
|
|
_ERR_DETECT_INITIALIZED,
|
|
_ERR_FAIL_ON_FILE_OPEN,
|
|
_ERR_MEMORY_FAIL,
|
|
_ERR_INVALID_DRIVER_ID,
|
|
_ERR_NO_DRIVER_FOUND,
|
|
_ERR_DETECTION_FAILURE,
|
|
_ERR_DRIVER_LOADED,
|
|
_ERR_INVALID_HANDLE,
|
|
_ERR_NO_HANDLES,
|
|
_ERR_PAUSED,
|
|
_ERR_NOT_PAUSED,
|
|
_ERR_INVALID_DATA,
|
|
_ERR_DRV_FILE_FAIL,
|
|
_ERR_INVALID_PORT,
|
|
_ERR_INVALID_IRQ,
|
|
_ERR_INVALID_DMA,
|
|
_ERR_INVALID_DMA_IRQ
|
|
};
|
|
|
|
// maximum number of timer events that can be registered
|
|
#define _TIMER_MAX_EVENTS 0x10
|
|
|
|
// flags for the debugging system
|
|
#define _SOS_DEBUG_NORMAL 0x0000
|
|
#define _SOS_DEBUG_NO_TIMER 0x0001
|
|
#define _SOS_TIMER_DPMI 0x0002
|
|
|
|
// define for types of DOS extenders
|
|
#define _SOS_RATIONAL 0x8000
|
|
#define _SOS_FLASHTECK 0x4000
|
|
|
|
// defines for the types of timers for different
|
|
// dos extenders
|
|
#define _SOS_TIMER_NEAR 0x8000
|
|
#define _SOS_TIMER_FAR 0x4000
|
|
|
|
// values for callback information
|
|
enum
|
|
{
|
|
_SAMPLE_PROCESSED,
|
|
_SAMPLE_LOOPING,
|
|
_SAMPLE_DONE
|
|
};
|
|
|
|
// define for special 18.2 callback rate to dos
|
|
#define _TIMER_DOS_RATE 0xff00
|
|
|
|
#pragma pack()
|
|
|
|
#pragma aux int_3 = "int 3"
|
|
|
|
#pragma pack( 1 )
|
|
typedef struct
|
|
{
|
|
unsigned region_size;
|
|
unsigned offset;
|
|
unsigned segment;
|
|
unsigned short number_available;
|
|
unsigned short number_used;
|
|
unsigned page0;
|
|
|
|
} EVDS_STRUCT;
|
|
|
|
typedef struct
|
|
{
|
|
unsigned region_size;
|
|
unsigned offset;
|
|
unsigned short segment;
|
|
unsigned short ID;
|
|
unsigned physical;
|
|
|
|
} VDS_STRUCT;
|
|
|
|
#pragma pack()
|
|
|
|
#include "sosdata.h"
|
|
#include "sosfnct.h"
|
|
|
|
#endif |