mirror of https://github.com/PCSX2/pcsx2.git
365 lines
11 KiB
C
365 lines
11 KiB
C
/***************************************************************************
|
|
externals.h - description
|
|
-------------------
|
|
begin : Wed May 15 2002
|
|
copyright : (C) 2002 by Pete Bernert
|
|
email : BlackDove@addcom.de
|
|
***************************************************************************/
|
|
|
|
/***************************************************************************
|
|
* *
|
|
* 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 2 of the License, or *
|
|
* (at your option) any later version. See also the license.txt file for *
|
|
* additional informations. *
|
|
* *
|
|
***************************************************************************/
|
|
|
|
//*************************************************************************//
|
|
// History of changes:
|
|
//
|
|
// 2004/04/04 - Pete
|
|
// - changed plugin to emulate PS2 spu
|
|
//
|
|
// 2002/04/04 - Pete
|
|
// - increased channel struct for interpolation
|
|
//
|
|
// 2002/05/15 - Pete
|
|
// - generic cleanup for the Peops release
|
|
//
|
|
//*************************************************************************//
|
|
|
|
|
|
/////////////////////////////////////////////////////////
|
|
// generic defines
|
|
/////////////////////////////////////////////////////////
|
|
|
|
//#define PSE_LT_SPU 4
|
|
//#define PSE_SPU_ERR_SUCCESS 0
|
|
//#define PSE_SPU_ERR -60
|
|
//#define PSE_SPU_ERR_NOTCONFIGURED PSE_SPU_ERR - 1
|
|
//#define PSE_SPU_ERR_INIT PSE_SPU_ERR - 2
|
|
|
|
#ifndef max
|
|
#define max(a,b) (((a) > (b)) ? (a) : (b))
|
|
#define min(a,b) (((a) < (b)) ? (a) : (b))
|
|
#endif
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
// spu defines
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
// sound buffer sizes
|
|
// 500 ms complete sound buffer
|
|
#define SOUNDSIZE 76800
|
|
|
|
// 200 ms test buffer... if less than that is buffered, a new upload will happen
|
|
#define TESTSIZE 26304//13152
|
|
|
|
// num of channels
|
|
#define MAXCHAN 48
|
|
#define HLFCHAN 24
|
|
|
|
// ~ 1 ms of data
|
|
#define NSSIZE 48
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// struct defines
|
|
///////////////////////////////////////////////////////////
|
|
// ADMA Channels
|
|
extern EXPORT_GCC void CALLBACK SPU2async(unsigned long cycle);
|
|
typedef struct
|
|
{
|
|
unsigned short * MemAddr;
|
|
unsigned short * TempMem;
|
|
unsigned int Index;
|
|
unsigned int AmountLeft;
|
|
unsigned int ADMAPos;
|
|
unsigned int TransferAmount;
|
|
int IRQ;
|
|
int TempAmount;
|
|
} ADMA;
|
|
|
|
typedef struct
|
|
{
|
|
int Left;
|
|
int Right;
|
|
} DINPUT;
|
|
|
|
// ADSR INFOS PER CHANNEL
|
|
typedef struct
|
|
{
|
|
int AttackModeExp;
|
|
long AttackTime;
|
|
long DecayTime;
|
|
long SustainLevel;
|
|
int SustainModeExp;
|
|
long SustainModeDec;
|
|
long SustainTime;
|
|
int ReleaseModeExp;
|
|
unsigned long ReleaseVal;
|
|
long ReleaseTime;
|
|
long ReleaseStartTime;
|
|
long ReleaseVol;
|
|
long lTime;
|
|
long lVolume;
|
|
} ADSRInfo;
|
|
|
|
typedef struct
|
|
{
|
|
int State;
|
|
int AttackModeExp;
|
|
int AttackRate;
|
|
int DecayRate;
|
|
int SustainLevel;
|
|
int SustainModeExp;
|
|
int SustainIncrease;
|
|
int SustainRate;
|
|
int ReleaseModeExp;
|
|
int ReleaseRate;
|
|
int EnvelopeVol;
|
|
long lVolume;
|
|
long lDummy1;
|
|
long lDummy2;
|
|
} ADSRInfoEx;
|
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
// Tmp Flags
|
|
|
|
// used for debug channel muting
|
|
#define FLAG_MUTE 1
|
|
|
|
// used for simple interpolation
|
|
#define FLAG_IPOL0 2
|
|
#define FLAG_IPOL1 4
|
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
// MAIN CHANNEL STRUCT
|
|
typedef struct
|
|
{
|
|
// no mutexes used anymore... don't need them to sync access
|
|
//HANDLE hMutex;
|
|
|
|
int bNew; // start flag
|
|
|
|
int iSBPos; // mixing stuff
|
|
int spos;
|
|
int sinc;
|
|
int SB[32+32]; // Pete added another 32 dwords in 1.6 ... prevents overflow issues with gaussian/cubic interpolation (thanx xodnizel!), and can be used for even better interpolations, eh? :)
|
|
int sval;
|
|
|
|
unsigned char * pStart; // start ptr into sound mem
|
|
unsigned char * pCurr; // current pos in sound mem
|
|
unsigned char * pLoop; // loop ptr in sound mem
|
|
|
|
int iStartAdr;
|
|
int iLoopAdr;
|
|
int iNextAdr;
|
|
|
|
int bOn; // is channel active (sample playing?)
|
|
int bStop; // is channel stopped (sample _can_ still be playing, ADSR Release phase)
|
|
int bEndPoint; // end point reached
|
|
int bReverbL; // can we do reverb on this channel? must have ctrl register bit, to get active
|
|
int bReverbR;
|
|
|
|
int bVolumeL; // Volume on/off
|
|
int bVolumeR;
|
|
|
|
int iActFreq; // current psx pitch
|
|
int iUsedFreq; // current pc pitch
|
|
int iLeftVolume; // left volume
|
|
int iLeftVolRaw; // left psx volume value
|
|
int bIgnoreLoop; // ignore loop bit, if an external loop address is used
|
|
int iMute; // mute mode
|
|
int iRightVolume; // right volume
|
|
int iRightVolRaw; // right psx volume value
|
|
int iRawPitch; // raw pitch (0...3fff)
|
|
int iIrqDone; // debug irq done flag
|
|
int s_1; // last decoding infos
|
|
int s_2;
|
|
int bRVBActive; // reverb active flag
|
|
int bNoise; // noise active flag
|
|
int bFMod; // freq mod (0=off, 1=sound channel, 2=freq channel)
|
|
int iOldNoise; // old noise val for this channel
|
|
ADSRInfo ADSR; // active ADSR settings
|
|
ADSRInfoEx ADSRX; // next ADSR settings (will be moved to active on sample start)
|
|
|
|
} SPUCHAN;
|
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
typedef struct
|
|
{
|
|
int StartAddr; // reverb area start addr in samples
|
|
int EndAddr; // reverb area end addr in samples
|
|
int CurrAddr; // reverb area curr addr in samples
|
|
|
|
int VolLeft;
|
|
int VolRight;
|
|
int iLastRVBLeft;
|
|
int iLastRVBRight;
|
|
int iRVBLeft;
|
|
int iRVBRight;
|
|
int iCnt;
|
|
|
|
int FB_SRC_A; // (offset)
|
|
int FB_SRC_B; // (offset)
|
|
int IIR_ALPHA; // (coef.)
|
|
int ACC_COEF_A; // (coef.)
|
|
int ACC_COEF_B; // (coef.)
|
|
int ACC_COEF_C; // (coef.)
|
|
int ACC_COEF_D; // (coef.)
|
|
int IIR_COEF; // (coef.)
|
|
int FB_ALPHA; // (coef.)
|
|
int FB_X; // (coef.)
|
|
int IIR_DEST_A0; // (offset)
|
|
int IIR_DEST_A1; // (offset)
|
|
int ACC_SRC_A0; // (offset)
|
|
int ACC_SRC_A1; // (offset)
|
|
int ACC_SRC_B0; // (offset)
|
|
int ACC_SRC_B1; // (offset)
|
|
int IIR_SRC_A0; // (offset)
|
|
int IIR_SRC_A1; // (offset)
|
|
int IIR_DEST_B0; // (offset)
|
|
int IIR_DEST_B1; // (offset)
|
|
int ACC_SRC_C0; // (offset)
|
|
int ACC_SRC_C1; // (offset)
|
|
int ACC_SRC_D0; // (offset)
|
|
int ACC_SRC_D1; // (offset)
|
|
int IIR_SRC_B1; // (offset)
|
|
int IIR_SRC_B0; // (offset)
|
|
int MIX_DEST_A0; // (offset)
|
|
int MIX_DEST_A1; // (offset)
|
|
int MIX_DEST_B0; // (offset)
|
|
int MIX_DEST_B1; // (offset)
|
|
int IN_COEF_L; // (coef.)
|
|
int IN_COEF_R; // (coef.)
|
|
} REVERBInfo;
|
|
|
|
#ifdef _WINDOWS
|
|
extern HINSTANCE hInst;
|
|
#define WM_MUTE (WM_USER+543)
|
|
#endif
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// SPU.C globals
|
|
///////////////////////////////////////////////////////////
|
|
|
|
#ifndef _IN_SPU
|
|
|
|
// psx buffers / addresses
|
|
|
|
extern unsigned short regArea[];
|
|
extern unsigned short spuMem[];
|
|
extern unsigned char * spuMemC;
|
|
extern unsigned char * pSpuIrq[];
|
|
extern unsigned char * pSpuBuffer;
|
|
|
|
// user settings
|
|
|
|
extern int iUseXA;
|
|
extern int iVolume;
|
|
extern int iXAPitch;
|
|
extern int iUseTimer;
|
|
extern int iDebugMode;
|
|
extern int iRecordMode;
|
|
extern int iUseReverb;
|
|
extern int iUseInterpolation;
|
|
extern int iDisStereo;
|
|
extern int aSync;
|
|
// MISC
|
|
|
|
extern SPUCHAN s_chan[];
|
|
extern REVERBInfo rvb[];
|
|
|
|
extern unsigned long dwNoiseVal;
|
|
extern unsigned short spuCtrl2[];
|
|
extern unsigned short spuStat2[];
|
|
extern unsigned long spuIrq2[];
|
|
extern unsigned long spuAddr2[];
|
|
extern unsigned long spuRvbAddr2[];
|
|
extern unsigned long spuRvbAEnd2[];
|
|
|
|
extern int bEndThread;
|
|
extern int bThreadEnded;
|
|
extern int bSpuInit;
|
|
|
|
extern int SSumR[];
|
|
extern int SSumL[];
|
|
extern int iCycle;
|
|
extern short * pS;
|
|
extern unsigned long dwNewChannel2[];
|
|
extern unsigned long dwEndChannel2[];
|
|
|
|
extern int iSpuAsyncWait;
|
|
|
|
#ifdef _WINDOWS
|
|
extern HWND hWMain; // window handle
|
|
extern HWND hWDebug;
|
|
#endif
|
|
|
|
extern void (CALLBACK *cddavCallback)(unsigned short,unsigned short);
|
|
|
|
#endif
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// DSOUND.C globals
|
|
///////////////////////////////////////////////////////////
|
|
|
|
#ifndef _IN_DSOUND
|
|
|
|
#ifdef _WINDOWS
|
|
extern unsigned long LastWrite;
|
|
extern unsigned long LastPlay;
|
|
#endif
|
|
|
|
#endif
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// RECORD.C globals
|
|
///////////////////////////////////////////////////////////
|
|
|
|
#ifndef _IN_RECORD
|
|
|
|
#ifdef _WINDOWS
|
|
extern int iDoRecord;
|
|
#endif
|
|
|
|
#endif
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// XA.C globals
|
|
///////////////////////////////////////////////////////////
|
|
|
|
#ifndef _IN_XA
|
|
|
|
extern xa_decode_t * xapGlobal;
|
|
|
|
extern unsigned long * XAFeed;
|
|
extern unsigned long * XAPlay;
|
|
extern unsigned long * XAStart;
|
|
extern unsigned long * XAEnd;
|
|
|
|
extern unsigned long XARepeat;
|
|
extern unsigned long XALastVal;
|
|
|
|
extern int iLeftXAVol;
|
|
extern int iRightXAVol;
|
|
|
|
#endif
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// REVERB.C globals
|
|
///////////////////////////////////////////////////////////
|
|
|
|
#ifndef _IN_REVERB
|
|
|
|
extern int * sRVBPlay[];
|
|
extern int * sRVBEnd[];
|
|
extern int * sRVBStart[];
|
|
|
|
#endif
|